【LeetCode 75】第十九题(724)寻找数组的中心下标

目录

题目:

示例:

​分析:

代码+运行结果:


题目:

示例:

分析:

给一个数组,让我们找出一个下标,在这个下标左边的元素总和等于这个下标右边的元素总和.

我们可以把整个数组的总和求出来,然后再从左往右遍历一次数组,遍历的同时将遍历过的数累加记录到一个变量中.若遍历到一个数,总和减去它等于遍历过的累加的总和的两倍,那么这个数就是数组的中间,它的下标就是我们要求的下标.

(上图做错了,但是我懒得改了,右下角方框里应该是 (总和-numsi)/2 == temp) ).

也可以使用前缀和的方法,一样是用一个变量来记录累加的结果,经过三次遍历,第一次遍历记录每个坐标左边累加的结果,第二次遍历记录每个坐标右边累加的结果,第三次遍历寻找到左右累加结果一致的坐标.

代码+运行结果:

cpp 复制代码
class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        //统计总和
        int SUM=0,temp=0;
        for(const int &num:nums) SUM+=num;
        for(int i=0;i<nums.size();i++){
            if((SUM-nums[i])/2.0==static_cast<double>(temp)) return i;
            temp+=nums[i];
        }
        return -1;
    }
};
cpp 复制代码
class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        //前缀和
        vector<pair<int,int>>cache(nums.size(),make_pair(0,0));
        int temp=0;
        for(int i=0;i<nums.size();i++){ //获取前缀和
            cache[i].first=temp;
            temp+=nums[i];
        }
        temp=0;
        for(int i=nums.size()-1;i>=0;i--){  //获取后缀和
            cache[i].second=temp;
            temp+=nums[i];
        }
        for(int i=0;i<cache.size();i++){    //若是前缀后缀一致则返回
            if(cache[i].first==cache[i].second) return i;
        }
        return -1;
    }
};
相关推荐
动词ing9 小时前
【题目练习】算法 组合总和||
算法
wuminyu9 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
longlongzihan9 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源10 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
liulilittle10 小时前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c
Logic10110 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi01110 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
无忧.芙桃10 小时前
C++语言原理与实践(十二):list类的底层实现
c++·windows·list
沫璃染墨10 小时前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
极光通讯10 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法