在解题的时候肯定要遍历数组的, 而遍历顺序就是从前往后的, i
暴力枚举就是for循环遍历,上面为了写的逼格高一点
即
for(i=0;i<nums.length;i++){
for(j=1+i;j<nums.length;j++) {
}
//注意为什么一开始是j=1呢,
//因为你是从第一个数跟第二个,第三个数去组合啊,
//然后加i是为了不会跟当前循环的数进行组合,
就比如,num[]={1,2,3,1,1,3}
第一次循环是(1,2),(1,3),(1,1)(1,1)(1,3),这样看来下来是不是没有问题,
继续往下遍历
第二次循环是:(2,2)(2,3)(2,1)(2,1)(2,3)
诶出问题了,2是不是跟自己搭配了,明明2只有一个数,这里就成了双。
所以加了i的变量j每一次循环后都不会与自己搭配。
代码如下(示例):
public int numIdenticalPairs(int[] nums) {
int i,j;
int sum=0;
for(i=0;i<nums.length;i++){
for(j=1+i;j<nums.length;j++){
if(nums[i]==nums[j]){
sum++;
}
}
}
return sum;
}
代码如下(示例):
输入:nums = [1,2,3,1,1,3]
运行结果为:4
一般呢你最快想到的别人肯定也想的到,而且你最快想到的有可能在时间空间上的性能没有那么的好。
所以希望在读题的时候尽量的多想想,有没有更优解噢!
在看了好多评论的解法后,
发现了这这一题其实是可以简化了:也就是统计nums[]数组中每一个数字出现的次数。
思路:
用 [1,1,1,1] 这样一个数组第一次遇到1的时候, 统计数+=0, 第二次遇到1的时候, 统计数+=1, 第三次遇到1的时候, 统计数+=2, 第四次遇到1的时候, 统计数+=3, ( 所有不同的数字都按照这个规律以此类推… ) 最后的统计结果为 0+1+2+3 = 6
这个思想其实跟桶排序是有关系的,我自己也有写了一篇关于桶算法的
“桶算法“
如果哪里有不清晰的请在说出来,谢谢。
public int numIdenticalPairs(int[] nums) {
int ans = 0;
//因为 1<= nums[i] <= 100 所以申请大小为100的数组
//temp用来记录num的个数
int[] temp = new int[100];
/*
从前面开始遍历nums
假设nums = [1,1,1,1]
第一遍
temp是[0,0,0,0]
ans+=0;
temp[0]++;
第二遍
temp是[1,0,0,0]
ans+=1;
temp[0]++;
第三遍
temp=[2,0,0,0]
ans+=2;
temp[0]++;
第四遍
temp=[3,0,0,0]
ans+=3;
temp[0]++;
*/
for (int num : nums) {
/*
这行代码可以写成
ans+=temp[num - 1];
temp[num - 1]++;
*/
ans += temp[num - 1]++;
}
return ans;
}
觉得对刷题会有帮助的一句话!
"不要一看到什么问题就马上就开始敲, 应该先思考一下题目本身是不是可以变形或简化."