菜鸟刷题Day5

这篇具有很好参考价值的文章主要介绍了菜鸟刷题Day5。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

⭐作者:别动我的饭
⭐专栏:菜鸟刷题
⭐标语:悟已往之不谏,知来者之可追
菜鸟刷题Day5

一.一维数组的动态和:1480. 一维数组的动态和 - 力扣(LeetCode)

描述

给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。

请返回 nums 的动态和。

示例:

输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。

解题思路

1.通过观察示例可以发现,其实runningSum[0]和nums[0]相等,runningSum[1]=runningSum[0]+nums[1];所以我们可以得到这样一个结论:当 i > 0时:runningSum[i]=runningSum[i-1]+nums[i];

我可以新开辟一个数组(大小和nums一样大),将累加的结果存放到这个新开的数组中,再返回这个新开辟的数组。

int* runningSum(int* nums, int numsSize, int* returnSize)
{	
    int*tmp=(int*)malloc(sizeof(int)*numsSize);
    tmp[0]=nums[0];
    
    for(int i=1;i<numsSize;i++)
    {
        tmp[i]=tmp[i-1]+nums[i];
    }
    *returnSize=numsSize;
    
    return tmp;
}

2.直接在原地改变,除了第一项不用改变以外,后面的每一项元素都是前面元素累加的结果。

int* runningSum(int* nums, int numsSize, int* returnSize)
{
    for(int i=1;i<numSize;i++)
    {
         nums[i]+=nums[i-1];
    }
    
    *returnSize=numsSize;
    
    return nums;
}

二.搜索插入位置:35. 搜索插入位置 - 力扣(LeetCode)

描述

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。


解题思路

看到说时间复杂度位O(log n)就让人想起二分查找算法,二分查找虽然强大,但是有一个很大的缺陷就是要求被查找的数据必须要有序。正好题目说了是一个排序数组,那还不二分走起

int searchInsert(int* nums, int numsSize, int target)
{
    int begin=0;
    int end=numsSize-1;
    int mid=0;
    
    while(begin<=end)
    {
        mid=(begin+end)/2;
        
        if(nums[mid]<target)
        {
            begin=mid+1;
        }
        else if(nums[mid]>target)
        {
            end=mid-1;
        }
        else//相等
        {
            return mid;
        }
        

    }
   return begin;
}

关于最后的返回值:位于begin左边的数一定小于目标值,而在end右边的数一定是大于end的,也就是说目标值要么在begin和end的中间,要么就在begin和end之间的某个位置插入,而最后的结束条件是begin>end,也就是说这中间只有begin是一直在改变的,因此如果最后在数组中找不到这个元素,那么它的插位置一定是begin位置


三.搜索旋转排序数组:33. 搜索旋转排序数组 - 力扣(LeetCode)

描述

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。


解题思路

首先映入眼帘的还是O(log n),那么用二分查找吗?一看是升序排序数组,但是这里又说了,会在某个位置旋转一下。好像不能用二分

但是(我知道你在等但是),在k位置旋转以后,仍然是局部有序的。如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪一半了

这里只要通过控制下标就可以实现在一个数组内分割出两个数组的目的

int search(int* nums, int numsSize, int target)
{
    //核心在于只是局部有序

    int begin=0,end=numsSize-1;
    while(begin<=end)
    {
        int mid=(begin+end)/2;

        if(nums[mid]==target)
            return mid;

        //二分查找只能在有序数列中进行,所以要判断有序范围,一定是局部有序
        if(nums[mid]<nums[end])//说明右边数组有序
        {
            //判断一下目标值是否在右边数组中,既然在右边数组,那么就要重新调整一下mid的值
            if(nums[mid]<target&&nums[end]>=target)
                 begin=mid+1;
            else
                end=mid-1;      
        }
        else
        {
            //左边数组有序,还要判断一下是否在左边数组中
            if(nums[mid]>target&&nums[begin]<=target)
                end=mid-1;
            else
                begin=mid+1;
        }

    }
    //到这里就是找不到
    return -1;
}

四.二进制链表转整数:1290. 二进制链表转整数 - 力扣(LeetCode)

描述

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值
链表不为空; 链表的结点总数不超过 30; 每个结点的值不是0就是 1

示例:

输入:head = [1,0,1]
输出:5
解释:二进制数 (101) 转化为十进制数 (5)

解题思路

1.建立一个数组,然后遍历链表,将链表中的值存取到数组中,将数组的内容转换成十进制,在size-1位置的反而是于二的零次方相乘,所以可以得到如下代码

	int getDecimalValue(struct ListNode* head)
 {

    int arr[31];
    int i=0;
    int flag=0;//做标记,如果数组中没有1,无论链表多长结果都是0
    while(head!=NULL)
    {
        arr[i]=head->val;
        i++;
        if(head->val==1)
        {
            flag=1;
        }
        head=head->next;
    }
    //将链表中的数值全部提取到数组中,必须要拿到数组的有效长度
    int sum=0;
    int sz=i;

    if(flag==0)
        return 0;
    else
    {
        for(i=0;i<sz;i++)
        {
           if(arr[i]!=0)
           {
                sum+=pow(2,sz-1-i);
           }
        }
    }

    return sum;
}

2.此外还可以利用位运算,第一次就从链表中拿到的那个数其实是二的size-1次方,而左移一位就有乘二的效果

int getDecimalValue(struct ListNode* head)
{
    int sum=0;
    
    while(head!=NULL)
    {
        sum=(sum<<1)+head->val;
        
        head=head->next;
    }
    
    return sum;
}

人们总是高估短期努力能带来的提升,而忽略长期坚持带来的改变。今天是第五天,也是第二十题了,你还在坚持吗?文章来源地址https://www.toymoban.com/news/detail-404195.html

到了这里,关于菜鸟刷题Day5的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【欢迎您的到来】这里是开源库get_local_info作者的付费专栏

    您好,         我是带剑书生,开源库get_local_info的作者,欢迎您的到来,这里是我的付费专栏,在上一个付费专栏里,用简洁的语言,通俗的话语,帮助您更好的学习了Rust,现在将用本专栏来为您解决学习和工作中遇到的《疑难杂症》,让您带飞项目,反击暴击~    

    2024年01月19日
    浏览(40)
  • C++(day5)

    实现一个图形类(Shape),包含受保护成员属性:周长、面积,公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有属性:半径,公共成员函数:特殊成员函数、以及获取周长、获取面积函数 定义一个矩形类(Rect),继承自图形类,包含私

    2024年02月09日
    浏览(60)
  • 国庆假期day5

    1.OSI七层模型: 应用层--------提供函 表示层--------表密缩 会话层--------会话 传输层--------进程的接收和发送 网络层--------寻主机 数据链路层----相邻节点的可靠传输 物理层--------二进制比特流 OSI四层(五层)模型: 应用层 传输层 网络层 数据链路层+物理层-----网络接口和物理

    2024年02月07日
    浏览(37)
  • 学成在线----day5

    当前要开发的是媒资管理服务,目前为止共三个微服务:内容管理、系统管理、媒资管理,如下图: 后期还会添加更多的微服务,当前这种由前端直接请求微服务的方式存在弊端: 如果在前端对每个请求地址都配置绝对路径,非常不利于系统维护,比如下边代码中请求系统

    2024年02月08日
    浏览(54)
  • Qt(Day5)

    写TCP服务器与客户端:    

    2024年02月13日
    浏览(42)
  • QT day5

    服务器: 客户端: 思维导图:

    2024年02月09日
    浏览(29)
  • C++day5

     2、   运行效果如下  

    2024年02月12日
    浏览(42)
  • 网络编程day5

    思维导图 多路复用 selsect ser cli poll ser cli

    2024年01月22日
    浏览(42)
  • day5 - 利用阈值勾勒

    阈值处理在计算机视觉技术中占有十分重要的位置,他是很多高级算法的底层逻辑之一。本实验将练习使用图像阈值处理技术来处理不同的情况的图像,并获得图像轮廓。 完成本期内容,你可以: 了解图像阈值处理技术的定义和作用 掌握各阈值处理技术的原理 了解自适应阈

    2024年02月06日
    浏览(32)
  • 蓝桥杯训练day5

    p是模式串,s是主串 第一步:算出p的最长前后缀,用两个p来求 第二部:算出p在s中的位置,用p和s来求 单调栈模板题 思路: 整理了一下: 求左边第一个小的数,等价于求右边第一个小的数(将答案倒过来即可),从左往右使用单调递增的栈 求左边第一个大的数,等价于求

    2023年04月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包