数组
哈希表
计数
题目描述
给你一个下标从 0 开始的整数数组 nums
。在一步操作中,你可以执行以下步骤:
从 nums
选出 两个 相等的 整数
从 nums
中移除这两个整数,形成一个 数对
请你在 nums
上多次执行此操作直到无法继续执行。
返回一个下标从 0 开始、长度为 2
的整数数组 answer
作为答案,其中 answer[0]
是形成的数对数目,answer[1]
是对 nums
尽可能执行上述操作后剩下的整数数目。
示例 1:
输入: nums = [1,3,2,1,3,2,2]
输出: [3,1]
解释:
nums[0] 和 nums[3] 形成一个数对,并从 nums 中移除,nums = [3,2,3,2,2] 。
nums[0] 和 nums[2] 形成一个数对,并从 nums 中移除,nums = [2,2,2] 。
nums[0] 和 nums[1] 形成一个数对,并从 nums 中移除,nums = [2] 。
无法形成更多数对。总共形成 3 个数对,nums 中剩下 1 个数字。
示例 2:
输入: nums = [1,1]
输出: [1,0]
解释: nums[0] 和 nums[1] 形成一个数对,并从 nums 中移除,nums = [] 。
无法形成更多数对。总共形成 1 个数对,nums 中剩下 0 个数字。
示例 3:
输入: nums = [0]
输出: [0,1]
解释: 无法形成数对,nums 中剩下 1 个数字。
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
解法
方法一:计数
我们可以统计数组 nums
中每个数字 $x$ 出现的次数,记录在哈希表或数组 cnt
中。
然后遍历 cnt
,对于每个数字 $x$,如果 $x$ 出现的次数 $v$ 大于 $1$,则可以从数组中选出两个 $x$ 形成一个数对,我们将 $v$ 除以 $2$ 向下取整,即可得到当前数字 $x$ 可以形成的数对数目,然后我们累加这个数目到变量 $s$ 中。
最后剩余的个数为数组 nums
的长度减去可以形成的数对数目乘以 $2$,即 $n - s \times 2$。
答案为 $[s, n - s \times 2]$。
时间复杂度 $O(n)$,空间复杂度 $O(C)$。其中 $n$ 为数组 nums
的长度;而 $C$ 为数组 nums
中数字的范围,本题中 $C = 101$。
Python3 Java C++ Go TypeScript Rust JavaScript C# C
class Solution :
def numberOfPairs ( self , nums : List [ int ]) -> List [ int ]:
cnt = Counter ( nums )
s = sum ( v // 2 for v in cnt . values ())
return [ s , len ( nums ) - s * 2 ]
1
2
3
4
5
6
7
8
9
10
11
12
13 class Solution {
public int [] numberOfPairs ( int [] nums ) {
int [] cnt = new int [ 101 ] ;
for ( int x : nums ) {
++ cnt [ x ] ;
}
int s = 0 ;
for ( int v : cnt ) {
s += v / 2 ;
}
return new int [] { s , nums . length - s * 2 };
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class Solution {
public :
vector < int > numberOfPairs ( vector < int >& nums ) {
vector < int > cnt ( 101 );
for ( int & x : nums ) {
++ cnt [ x ];
}
int s = 0 ;
for ( int & v : cnt ) {
s += v >> 1 ;
}
return { s , ( int ) nums . size () - s * 2 };
}
};
func numberOfPairs ( nums [] int ) [] int {
cnt := [ 101 ] int {}
for _ , x := range nums {
cnt [ x ] ++
}
s := 0
for _ , v := range cnt {
s += v / 2
}
return [] int { s , len ( nums ) - s * 2 }
}
function numberOfPairs ( nums : number []) : number [] {
const n = nums . length ;
const count = new Array ( 101 ). fill ( 0 );
for ( const num of nums ) {
count [ num ] ++ ;
}
const sum = count . reduce (( r , v ) => r + ( v >> 1 ), 0 );
return [ sum , n - sum * 2 ];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14 impl Solution {
pub fn number_of_pairs ( nums : Vec < i32 > ) -> Vec < i32 > {
let n = nums . len ();
let mut count = [ 0 ; 101 ];
for & v in nums . iter () {
count [ v as usize ] += 1 ;
}
let mut sum = 0 ;
for v in count . iter () {
sum += v >> 1 ;
}
vec! [ sum as i32 , ( n - sum * 2 ) as i32 ]
}
}
1
2
3
4
5
6
7
8
9
10
11
12 /**
* @param {number[]} nums
* @return {number[]}
*/
var numberOfPairs = function ( nums ) {
const cnt = new Array ( 101 ). fill ( 0 );
for ( const x of nums ) {
++ cnt [ x ];
}
const s = cnt . reduce (( a , b ) => a + ( b >> 1 ), 0 );
return [ s , nums . length - s * 2 ];
};
1
2
3
4
5
6
7
8
9
10
11
12
13 public class Solution {
public int [] NumberOfPairs ( int [] nums ) {
int [] cnt = new int [ 101 ];
foreach ( int x in nums ) {
++ cnt [ x ];
}
int s = 0 ;
foreach ( int v in cnt ) {
s += v / 2 ;
}
return new int [] { s , nums . Length - s * 2 };
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 /**
* Note: The returned array must be malloced, assume caller calls free().
*/
int * numberOfPairs ( int * nums , int numsSize , int * returnSize ) {
int count [ 101 ] = { 0 };
for ( int i = 0 ; i < numsSize ; i ++ ) {
count [ nums [ i ]] ++ ;
}
int sum = 0 ;
for ( int i = 0 ; i < 101 ; i ++ ) {
sum += count [ i ] >> 1 ;
}
int * ans = malloc ( sizeof ( int ) * 2 );
ans [ 0 ] = sum ;
ans [ 1 ] = numsSize - sum * 2 ;
* returnSize = 2 ;
return ans ;
}
GitHub