好数对的数目(数组)算法题 --暴力枚举和组合计数

文章目录

    • 解法一:暴力枚举
  • 二、代码
    • 2输入数据
    • 解法二:组合计数
    • 代码块
  • 总结


好数对的数目(数组)算法题 --暴力枚举和组合计数_第1张图片

解法一:暴力枚举

在解题的时候肯定要遍历数组的, 而遍历顺序就是从前往后的, 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;
    }

2输入数据

代码如下(示例):

输入: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;
    }

总结

觉得对刷题会有帮助的一句话!

"不要一看到什么问题就马上就开始敲, 应该先思考一下题目本身是不是可以变形或简化."

你可能感兴趣的:(算法,leetcode,java)