首页 > 其他分享 >724. 寻找数组的中心下标

724. 寻找数组的中心下标

时间:2024-11-19 19:45:16浏览次数:1  
标签:std 下标 nums int 724 vector 数组 accumulate include

题目

自己写的

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int n = nums.size();
        vector<int> s(n, 0);
        s[0] = nums[0];
        for (int i = 1; i != n; ++i)
            s[i] = s[i - 1] + nums[i];
        for (int i = 0; i != n; ++i)
            if (s[i] - nums[i] == s[n - 1] - s[i])
                return i;
        return -1;
    }
};

看到这题第一眼,就觉得要用区间和来做。

看了卡哥思路,原来也可以不用区间和来做,而且似乎这个方案更优于区间和。

卡哥思路:

img

卡哥代码:

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int sum = 0;
        for (int num : nums) sum += num; // 求和
        int leftSum = 0;    // 中心索引左半和
        int rightSum = 0;   // 中心索引右半和
        for (int i = 0; i < nums.size(); i++) {
            leftSum += nums[i];
            rightSum = sum - leftSum + nums[i];
            if (leftSum == rightSum) return i;
        }
        return -1;
    }
};

而且卡哥这个代码里面还有一个妙处是在对nums[i]的处理上,让左右两边都加上nums[i],都加上一个相同的数,是不影响左右两边大小的判断的,而且通过这一举动,让代码也似乎简洁了些。

官方代码也蛮好的,先用数学思维化简了以下该题目:

官方思路:

img

官方代码:

class Solution {
public:
    int pivotIndex(vector<int> &nums) {
        int total = accumulate(nums.begin(), nums.end(), 0);
        int sum = 0;
        for (int i = 0; i < nums.size(); ++i) {
            if (2 * sum + nums[i] == total) {
                return i;
            }
            sum += nums[i];
        }
        return -1;
    }
};

补充一下accumulate函数

在 C++ 中,accumulate 是 <numeric> 头文件中提供的一个函数,用于对容器中的元素进行累计操作。它可以计算元素的总和,或者根据用户提供的操作函数累积计算结果。

语法:

#include <numeric>
template<class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);

template<class InputIterator, class T, class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);

参数说明

  • first 和 last:输入迭代器,指定范围 [first, last)

  • init:初始值,用于累加的起点。

  • binary_op (可选):一个二元操作函数或仿函数,指定累积时使用的自定义操作。

返回值

  • 返回累积操作后的结果。

使用示例

  • 示例 1:计算总和

    #include <iostream>
    #include <numeric>
    #include <vector>
    
    int main() {
        std::vector<int> nums = {1, 2, 3, 4, 5};
        int sum = std::accumulate(nums.begin(), nums.end(), 0); // 初始值为0
        std::cout << "Sum: " << sum << std::endl; // 输出: Sum: 15
        return 0;
    }
    
  • 示例 2:计算累积

    #include <iostream>
    #include <numeric>
    #include <vector>
    
    int main() {
        std::vector<int> nums = {1, 2, 3, 4};
        int product = std::accumulate(nums.begin(), nums.end(), 1, std::multiplies<int>()); // 初始值为1
        std::cout << "Product: " << product << std::endl; // 输出: Product: 24
        return 0;
    }
    
  • 示例 3:字符串拼接

    #include <iostream>
    #include <numeric>
    #include <vector>
    #include <string>
    
    int main() {
        std::vector<std::string> words = {"Hello", " ", "World", "!"};
        std::string result = std::accumulate(words.begin(), words.end(), std::string("")); // 初始值为空字符串
        std::cout << "Concatenated string: " << result << std::endl; // 输出: Concatenated string: Hello World!
        return 0;
    }
    
  • 示例 4:自定义累计规则

    1. 需求:计算所有数字的平方和

      #include <iostream>
      #include <numeric>
      #include <vector>
      
      int main() {
          std::vector<int> nums = {1, 2, 3, 4};
          // 自定义规则:累加平方值
          int squareSum = std::accumulate(nums.begin(), nums.end(), 0, 
                                          [](int acc, int x) { return acc + x * x; });
          std::cout << "Sum of squares: " << squareSum << std::endl; // 输出: Sum of squares: 30
          return 0;
      }
      

      解释

      • [](int acc, int x):这是一个 Lambda 表达式,表示累积时将每个元素的平方加到累计结果中。

      • 初始值为 0,然后逐步将每个元素平方后的值累加到 acc 中。

    2. 需求:找到最长字符串的长度

      #include <iostream>
      #include <numeric>
      #include <vector>
      #include <string>
      
      int main() {
          std::vector<std::string> words = {"C++", "Programming", "Language"};
          // 自定义规则:找最长字符串长度
          int maxLength = std::accumulate(words.begin(), words.end(), 0, 
                                          [](int maxLen, const std::string& word) { 
                                              return std::max(maxLen, static_cast<int>(word.length())); 
                                          });
          std::cout << "Longest word length: " << maxLength << std::endl; // 输出: Longest word length: 11
          return 0;
      }
      

注意

  • 初始值的类型 T 会影响结果类型。例如,如果初始值是浮点类型,结果也会是浮点类型。

  • 使用自定义操作时,确保二元操作符满足累积逻辑。

通过 accumulate,可以方便地对容器进行灵活的累计操作,减少手动循环的代码量。

标签:std,下标,nums,int,724,vector,数组,accumulate,include
From: https://www.cnblogs.com/hisun9/p/18555492

相关文章

  • 189. 轮转数组
    题目自己写的老拉了classSolution{public:voidrotate(vector<int>&nums,intk){constintn=nums.size();intans[100010]={};for(inti=0;i<n;++i)ans[(i+k)%n]=nums[i];for(inti=......
  • 洛谷题单指南-二叉堆与树状数组-P5677 [GZOI2017] 配对统计
    原题链接:https://www.luogu.com.cn/problem/P5677题意解读:所谓好的配对,通过分析公式∣ax−ay∣≤∣ax−ai∣(i≠x),可以得知就是一个ax与其差的绝对值最小的形成的配对,在数轴上就是距离ax最近的点ay,配对是下标(x,y),给定若干个区间[l,r],每个区间的配对数*区间编号的累加。解题思路:......
  • Scala(多维数组)
    最典型的的多维数组就是二维数组。objecttest3{defmain(args:Array[String]):Unit={//二维数组//2.1创建方式1valarr5=Array.ofDim[Int](2,2)//2行2列//2.2访问数组的元素arr5(0)(0)=1arr5(0)(1)=2arr5(1)(0)=3......
  • 新增时间段,但是不能与原来数组中的时间段有重叠
    如果用户添加的时间段,在上面显示时间段有重复的时间范围,则提示如下内容:执行函数的入参内容打印:点击查看实现代码exportfunctionaddTimeRange(timeRanges,newTimeRange){console.log('原有的时间范围的数组timeRanges',timeRanges)console.log('新的时间范围newTi......
  • 记录个Java/Groovy的小问题:空字符串调用split函数返回非空数组
    问题复现最近写了一个groovy替换程序增量流水线脚本(会Java也能看懂),示意脚本如下://获取文件列表方法deflistFiles(folder){defoutput=sh(script:"ls${folder}",returnStdout:true).trim()returnoutput.split('\n')asList}//调用以上方法获取lib目录下......
  • Java子类继承父类哪些内容 C语言初阶指针数组末
    1.publicclasstest18{/*publicstaticvoidmain(String[]args){Ziz1=newZi();Ziz2=newZi("zhangsan",15);}}classFu{Stringname;intage;publicFu(){}publicFu(Stringname,intage)......
  • C语言 | 指针 | 野指针 | 数组指针 | 指针数组 | 二级指针 | 函数指针 | 指针函数
    文章目录1.指针的定义2.指针的加减运算3.野指针4.指针&数组&传参&字符数组5.数组指针&指针数组6.二级指针7.指针函数&函数指针&回调函数8.函数指针数组&指向函数指针数组的指针1.指针的定义指针是内存中一个最小单元的编号,也就是地址。平常口语中所......
  • C语言的数组
    二&数组•数组的概念在数学中我们有集合的概念,那么在C语言中:数组是⼀组相同类型元素的集合;从这个概念中我们就可以发现2个有价值的信息:•数组中存放的是1个或者多个数据,但是数组元素个数不能为0。•数组中存放的多个数据,类型是相同的。数组分为⼀维数组和多......
  • C题目:指针-将数组a中的n个整数按相反顺序存放
    题目:将数组a中的n个整数按相反顺序存放代码:#include<stdio.h>voidinv(int*a,intlen){inttemp,i,j,m=(len-1)/2;for(i=0;i<=m;i++){j=len-1-i;temp=a[i];a[i]=a[j];a[j]=temp;}}intmain(){intlen,*p,i,a[1......
  • 代码随想录算法训练营第六天|哈希表|LC242. 有效的字母异位词|LC349. 两个数组的交集|
    哈希表    哈希表:用来快速判断一个元素是否出现在集合里;O(1);    哈希碰撞:比如小王和小李都映射到索引下表1的位置,有2中解决办法(拉链法和线性探测法);    拉链发:通过索引找到,其实拉链发就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内......