赞
踩
给你一个整数数组 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
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-good-pairs
题解:
首先想到的是双循环暴力计数就行,时间复杂度为;
- class Solution {
- public int numIdenticalPairs(int[] nums) {
- int count = 0;
- for(int i = 0;i < nums.length;i++){
- for(int j = i + 1;j < nums.length;j++){
- if(nums[i] == nums[j]){
- count++;
- }
- }
- }
- return count;
- }
- }
官方给出了另外一种解法,先找到元素相同的个数(记为v),同时要保证i<j,根据排列的思想就会找到v(v-1)/2种,例如nums = [1,2,3,1,1,3],以元素1为例,v=3,好对数的数量为2+1。
- class Solution {
- public int numIdenticalPairs(int[] nums) {
- int count = 0;
- // 存储元素出现的次数
- Map<Integer, Integer> m = new HashMap<Integer, Integer>();
- for(int i = 0;i < nums.length;i++){
- m.put(nums[i],m.getOrDefault(nums[i], 0) + 1);
- }
- for (Map.Entry<Integer, Integer> entry : m.entrySet()) {
- int v = entry.getValue();
- count += v * (v - 1) / 2;
- }
- return count;
- }
- }
看了别人的代码看到了一种有意思的解法,只有一句666。不用再次遍历map,如果这个数第一次出现,这个数的好对数为0,value更改为1,下一次这个数出现时,这个数的好对数就位0+1,value更改为2,一次类推,不同的数的好对数都会被计算。
- class Solution {
- public int numIdenticalPairs(int[] nums) {
- int count=0;
- Map<Integer,Integer> map=new HashMap<>();
- for(int num:nums){
- int value=map.getOrDefault(num,0);
- count+=value;
- map.put(num,valve+1);
- }
- return count;
- }
- }
另一种解法,不使用map:利用数组统计元素出现个数的统计过程,计算好对数的个数
- class Solution {
- public int numIdenticalPairs(int[] nums) {
- int count=0;
- //因为 1<= nums[i] <= 100 所以申请大小为100的数组
- //temp用来记录num的个数
- int[] temp = new int[100];
- /*
- 从前面开始遍历nums
- 假设nums = [1,1,1,1]
- 第一遍
- temp是[0,0,0,0]
- count+=0;
- temp[0]++;
- 第二遍
- temp是[1,0,0,0]
- count+=1;
- temp[0]++;
- 第三遍
- temp=[2,0,0,0]
- count+=2;
- temp[0]++;
- 第四遍
- temp=[3,0,0,0]
- count+=3;
- temp[0]++;
- */
- for (int num : nums) {
- /*
- 这行代码可以写成
- count+=temp[num - 1];
- temp[num - 1]++;
- */
- count += temp[num - 1]++;
- }
- return count;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。