You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言数组中自增运算符(++)的作用及LeetCode应用问询

关于C语言数组结合后缀自增运算符「++」的疑问解答

我是C语言初学者,在LeetCode的「好数对」问题中查看其他C语言解法时,对数组结合后缀自增运算符「」的行为产生了疑问。我知道「」能让数值加1,但不清楚它和数组一起用的时候具体是怎么运作的。

我的暴力解法

int numIdenticalPairs(int* nums, int numsSize){
    int count = 0;

    for (int i = 0; i < numsSize; i++)
    {
        for (int j = 0; j < numsSize; j++)
        {
            if (j > i && nums[i] == nums[j])
            {
                count++;
            }
        }
    }
    return count;
}

其他开发者的高效解法

int numIdenticalPairs(int* nums, int numsSize){
    int s = 0, a[101] = { 0 };
    for (int i = 0; i < numsSize; i++) s += a[nums[i]]++;
    return s;
}

核心疑问解答

首先明确后缀自增运算符++的本质规则:它会先返回变量的当前值,再对变量执行加1操作。放到数组场景中,a[nums[i]]++的执行步骤拆解如下:

  1. 先计算nums[i]的数值,以此作为数组a的下标,取出a[该下标]的当前值;
  2. 将这个取出的值加到累加变量s中;
  3. 最后把a[该下标]的数值加1,更新数组对应位置的存储值。

结合高效解法的逻辑理解

这个解法的核心思路是统计数字出现次数的同时,累加可形成的好数对数量:
每遇到一个数字nums[i],它能和之前所有已经出现过的同数字组成新的好数对——而a[nums[i]]存储的就是之前该数字出现的次数,把这个值加到s里,就相当于新增了对应数量的好数对,之后再把该数字的出现次数加1,为后续遍历做准备。

举个具体例子,假设nums = [1,2,1,1]:

  • 第一次遍历到1:a[1]当前是0,s += 0(s仍为0),之后a[1]变为1;
  • 第二次遍历到2:a[2]当前是0,s += 0(s仍为0),之后a[2]变为1;
  • 第三次遍历到1:a[1]当前是1,s += 1(s变为1,对应好数对(0,2)),之后a[1]变为2;
  • 第四次遍历到1:a[1]当前是2,s += 2(s变为3,对应好数对(0,3)、(2,3)),之后a[1]变为3;
    最终s=3,正好是所有符合要求的好数对数量,和暴力解法结果一致。

两种解法对比

你的暴力解法通过两层循环逐一检查符合j>i且nums[i]==nums[j]的情况,时间复杂度为O(n²);而高效解法利用题目中数值范围(0~100)的限制,用数组统计次数,时间复杂度仅为O(n),运行效率更高。


内容的提问来源于stack exchange,提问作者Nobuya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:29:54