【C语言】每日一题(寻找数组的中心下标)

这篇具有很好参考价值的文章主要介绍了【C语言】每日一题(寻找数组的中心下标)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

寻找数组的中心下标,链接奉上

【C语言】每日一题(寻找数组的中心下标),c语言,开发语言

暴力循环

​​​​​​​思路:

依旧是我们的老朋友,暴力循环。
1.可以利用外层for循环,循环变量为数组下标,在循环内分别求出下标左边与右边的sum
2.在边界时讨论,
当下标为左边界(nums[0])时,left sum=0;当下标为右边界(nums[numsSize-1)时,right sum=0
3.讨论完特殊情况后,进行左边与右边的比较;
左==右时,即代表我们找到了下标;
否则返回-1。

代码实现:

int pivotIndex(int* nums, int numsSize)
{
    for(int i=0;i<numsSize;i++)//外层for循环
    {
    int Lsum=0;//left sum的缩写。
    //在循环内部放置是因为防止这次的lsum加上上次的lsum,造成计算错误。
    
    if(i==0)//特殊情况,左边界
        Lsum=0;
    else
        for(int j=0;j<i;j++)//求lsum的值
            Lsum+=nums[j];
    int Rsum=0;
    if(i==numsSize-1)
        Rsum=0;
    else
        for(int j=i+1;j<numsSize;j++)
            Rsum+=nums[j];
    if(Lsum==Rsum)
    return i;
    }
    return -1;
}

但是,此种方法的时间复杂度巨大无比,我们可以进行改进

我们发现,每次进入for循环内时,总是会有重复的计算出现,比如:
计算i=0时的Rsum(ringt sum缩写),每次都重新计算了一遍,但是我们可以在上一次的基础上进行减nums[i],大大降低了计算量。

代码实现:

int pivotIndex(int* nums, int numsSize)
{
    int i=0;
    int j=0;
    int Lsum=0;
    int Rsum=0;
    for(i=0;i<numsSize;i++)//首先计算出Rsum的值,i=0时
    {
        Rsum+=nums[i];
    }
    for(i=0;i<numsSize;i++)
    {
       if(i==0)
       Lsum=0;
       else
       Lsum+=nums[i-1];//上一次的基础上加上nums[i-1]
       if(i==numsSize-1)
       Rsum=0;
       else
       Rsum-=nums[i];//上一次的基础上减上nums[i]
    if(Lsum==Rsum)
            return i;
    }
    return -1;
}

但是这样每次进循环都会判断一次是否在边界处
则可以在外部进行判断

int pivotIndex(int* nums, int numsSize)
{
    int i=0;
    int j=0;
    int Lsum=0;
    int Rsum=0;
    for(i=1;i<numsSize;i++)
        Rsum+=nums[i];
    if(Lsum==Rsum)
    return 0;
    for(i=1;i<numsSize;i++)
    {
       Lsum+=nums[i-1];
       Rsum-=nums[i];
    if(Lsum==Rsum)
            return i;
    }
    return -1;
}

前缀和

思路:

当找到下标时,意味着左右元素和相等。
设数组和为total,则total==Rsum+Lsum+nums[i]
又因左右相等,故total==2Rsum+nums[i]

代码实现:

int pivotIndex(int* nums, int numsSize)
{
    int total=0;
    int Rsum=0;
    for(int i=0;i<numsSize;i++)
    {
        total+=nums[i];
    }
    for(int i=0;i<numsSize;i++)
    {
        if(Rsum*2+nums[i]==total)
        return i;
        Rsum+=nums[i];
    }
    return -1;
}

欢迎讨论哦文章来源地址https://www.toymoban.com/news/detail-648864.html

到了这里,关于【C语言】每日一题(寻找数组的中心下标)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数据结构和算法】寻找数组的中心下标

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列长度 2.1.4 寻找数组中第 k 小的元素 2

    2024年02月04日
    浏览(53)
  • 【LeetCode 75】第十九题(724)寻找数组的中心下标

    目录 题目: 示例: ​分析: 代码+运行结果: 给一个数组,让我们找出一个下标,在这个下标左边的元素总和等于这个下标右边的元素总和. 我们可以把整个数组的总和求出来,然后再从左往右遍历一次数组,遍历的同时将遍历过的数累加记录到一个变量中.若遍历到一个数,总和减去它

    2024年02月14日
    浏览(91)
  • 【Leetcode每日一题】35.搜素插入位置|二分查找数组下标

    🌱博主简介:大一计科生,努力学习Java中!热爱写博客~预备程序媛 📜所属专栏:LeetCode每日一题–进击大厂 ✈往期博文回顾: 【JavaSE】保姆级教程|1万字+10张图学会类与对象–建议收藏 🕵️‍♂️近期目标:成为千粉小博主。 🌺“再牛的程序员也是从小白开始,既然开始

    2024年02月21日
    浏览(65)
  • ⭐北邮复试刷题LCR 012. 寻找数组的中心下标__前缀和思想 (力扣119经典题变种挑战)

    给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适

    2024年02月20日
    浏览(49)
  • 每日一题 154寻找旋转排序数组中的最小值||(二分)

    已知一个长度为  n  的数组,预先按照升序排列,经由  1  到  n  次  旋转  后,得到输入数组。例如,原数组  nums = [0,1,4,4,5,6,7]  在变化后可能得到: 若旋转  4  次,则可以得到  [4,5,6,7,0,1,4] 若旋转  7  次,则可以得到  [0,1,4,4,5,6,7] 注意,数组  [a[0], a[1], a[2], ...,

    2024年02月13日
    浏览(34)
  • 数据结构 | 寻找二维数组的最大值和对应下标 | C语言代码

    题目:         本题目要求读入M(最大为10)行N(最大为15)列个元素,找出其中最大的元素,并输出其行列值。 输入格式:         输入在第一行中给出行数m和列数n。接下来输入m*n个整数。 输出格式:         输出最大值的行号,列号,值。 输入样例: 2 3 1 2 3 4 5 6 输

    2024年02月05日
    浏览(53)
  • C语言每日一题:15:寻找峰值。

    题目链接

    2024年02月13日
    浏览(33)
  • C 语言每日一题——旋转数组的最小数字

     一、题目内容  提供一下该OJ题的链接:旋转数组的最小数字_牛客题霸_牛客网 (nowcoder.com) 二、题目分析 通过示例1可知, 我们写代码的目的是在数组中找到一个最大值,并且返回来 ; 我们很容易的会想到创建一个变量:int min = 0; 然后遍历整个数组,依次比较把一个最小值

    2024年01月19日
    浏览(55)
  • C语言每日一题(22)合并两个有序数组

    力扣网 88. 合并两个有序数组 给你两个按  非递减顺序  排列的整数数组  nums1   和  nums2 ,另有两个整数  m  和  n  ,分别表示  nums1  和  nums2  中的元素数目。 请你  合并   nums2   到  nums1  中,使合并后的数组同样按  非递减顺序  排列。 注意: 最终,合并后数组

    2024年02月08日
    浏览(42)
  • 【C语言】每日一题(除自身以外数组的乘积)

    添加链接描述,链接奉上 暴力循换真的是差生法宝,简单好懂,就是不实用,大多数的题目都会超过时间限制(无奈) 思路: 1.写一个除自身的数组乘积函数 2.利用 for循环遍历数组 , i 作为循环变量,当遍历到 i 时,就求出除 i 以外的数组乘积 3.放入返回数组中 代码实现

    2024年02月10日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包