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

news/2024/7/7 21:05:28

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

方法

  • 暴力循环
  • 前缀和

在这里插入图片描述

暴力循环

​​​​​​​思路:

依旧是我们的老朋友,暴力循环。
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;
}

欢迎讨论哦


http://lihuaxi.xjx100.cn/news/1445908.html

相关文章

EB配置------PORT(一)

今天学习了PortPinInputPullResistor 这个配置。 虽然它配置为输出后显示不可更改&#xff0c;但是它默认的配置依然有效。 该参数允许为所选端口引脚配置内部拉电阻[向上/向下]。 注意&#xff1a;此参数的默认值设置为相应SFR的重置值。 PORT_PIN_IN_NO_PULL&#xff1a;…

【CTF-MISC】眼见非实(掌握各类文件头)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/5.html 下载是一个.docx文档&#xff0c;用010 Editor打开查看文件头发现应该是zip文件&#xff0c;修改后缀后解压&#xff0c;查找flag。 各类常用文件头如下表所示。 文件类型文件头JPEG (jpg)FFD8FFE1PNG…

日常BUG——SpringBoot关于父子工程依赖问题

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 在父子工程A和B中。A依赖于B&#xff0c;但是A中却无法引入B中的依赖&#xff0c;具体出现的…

盒子阴影效果与环绕阴影

box-shadow 在前端样式里面&#xff0c;最常见的一中效果之一就是阴影&#xff0c;好的阴影可以瞬间给人一种高端的用户体验&#xff0c;今天简单总结下这个样式的语法与使用方法。 语法 box-shadow的语法其实是比较简单好记的&#xff0c;我们按照最全面的写法来看 x轴偏移…

Kotlin CompletableDeferred 入门

在 Kotlin 中&#xff0c;CompletableDeferred 是一个用于异步编程的类&#xff0c;它提供了一种实现异步操作和等待操作结果的方式。 CompletableDeferred 是 Deferred 接口的具体实现之一&#xff0c;可以用于表示一个可能会在将来完成的操作。它提供了以下主要功能&#xf…

uniapp开发微信小程序底部地区选择弹框

个人项目地址&#xff1a; SubTopH前端开发个人站 &#xff08;自己开发的前端功能和UI组件&#xff0c;一些有趣的小功能&#xff0c;感兴趣的伙伴可以访问&#xff0c;欢迎提出更好的想法&#xff0c;私信沟通&#xff0c;网站属于静态页面&#xff09; SubTopH前端开发个人站…

8,四个类型转换const_cast、reinterpret_cast、dynamic_cast、static_cast

类型转换const_cast、reinterpret_cast、dynamic_cast、static_cast const_castreinterpret_castdynamic_caststatic_cast const_cast 被const修饰的函数可以被访问&#xff0c;但是不能被修改成员变量 const_cast可以去掉const #include <iostream> using namespace s…

一文秒懂HTTP协议到底是什么?原理?

目录 1.什么是http协议&#xff1f; 2.http协议的版本&#xff1f; 3.http文本框架 4.http请求报文 5.http报文格式 6.http响应报文 7.HTTP的状态码 8.HTTP首部介绍 9.什么是URL和URI&#xff1f; 10.CGI是什么&#xff1f; 1.什么是http协议&#xff1f; http&#…