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]]++的执行步骤拆解如下:
- 先计算
nums[i]的数值,以此作为数组a的下标,取出a[该下标]的当前值; - 将这个取出的值加到累加变量
s中; - 最后把
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
相关产品推荐
相关产品推荐

