每日学习一个算法——好数对(今天有时间,多写一篇)
题目
给你一个整数数组 nums 。
如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。
返回好数对的数目。
示例 1:
输入:nums = [1,2,3,1,1,3]
输出:4
解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始
示例 2:
输入:nums = [1,1,1,1]
输出:6
解释:数组中的每组数字都是好数对
示例 3:
输入:nums = [1,2,3]
输出:0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-good-pairs
提示:以下是本篇文章正文内容,下面案例可供参考
一、解题思路
用一个嵌套循环,外部循环从0开始到nums.length-1,因为最后一个数不用再去比较了,内部循环从i开始nums.length结束,定义一个count来计算有多少好数对,这就是普通的暴力解法。
二、代码实现
1.第一遍
public static int[] JiSuan(int[] nums){
int count = 0;
for (int i = 0; i < nums.length-1; i++) {
for (int j = i+1; j < nums.length; j++) {
if (nums[i] == nums[j]) {
count++;
}
}
}
return count;
}
速度还凑合,就是代码有点冗余。
2.第二遍
public static int JiSuan(int[] nums) {
int count = 0;
int[] temp = new int[100];//temp用来记录num的个数,
for(int num:nums){
count+=temp[num-1];
temp[num - 1]++;
}
return count;
}
测试用例:[1 1 1 1 1 1],正确输出结果:10。
用全1的测试用例,这样比较好去理解。
下面是Debug,每一步都Debug。
说实话,我也不太懂,也是看的大佬的算法,只能说懂一半吧。
他会计算这个数,比如‘1’,计算一共出现几个‘1’,那么上图中是出现了5个‘1’,所以好数对的组合,从第一个数开始比较的话,就是4+3+2+1=10;
2.第二遍
public static int JiSuan(int[] nums) {
int count = 0;
int[] temp = new int[100];//temp用来记录num的个数,
for(int num:nums){
ans += temp[num - 1]++;
}
return count;
}
这是最终简化的代码了,原理与第二遍代码是一样的,不多赘述。
今天的题,着实让我这个小白很伤脑筋。
总结
学的算法简单的话,不难的话,学习还有什么意义?都会了还学他干嘛?所以还是慢慢啃硬骨头吧。