Hot100刷题

Hot100刷题

【技巧】

136. 只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

【思考】

  1. 数字异或自身,结果是0

【代码】

1
2
3
4
5
6
7
8
9
class Solution {
public int singleNumber(int[] nums) {
int ans = 0;
for(int num: nums){
ans ^= num;
}
return ans;
}
}

169. 多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

【思考】

  1. 众数数量大于n/2,划分两类,众数/非众数,投票来决出多数。
  2. 需要记录两个元素:众数、票数

【代码】

1
2
3
4
5
6
7
8
9
10
class Solution {
public int majorityElement(int[] nums) {
int x = 0, votes = 0;
for(int num : nums){
if(votes == 0) x = num;
votes += num == x ? 1 : -1;
}
return x;
}
}

75. 颜色分类

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,**原地** 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 012 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

【思考】

  1. 模拟取出球,放到对应位置的行为。
  2. 需要记录红、白、蓝球的边界。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public void sortColors(int[] nums) {
int x = 0, y = 0, z = 0;
for(int num : nums){
if(num == 0){
x++;
y++;
z++;
}else if(num == 1){
y++;
z++;
}else if(num == 2){
z++;
}
}
for(int i = 0; i < nums.length; i++){
if(i < x){
nums[i] = 0;
}else if(i < y){
nums[i] = 1;
}else{
nums[i] = 2;
}
}

}
}

Hot100刷题
https://wengerblogs.me/2025/05/13/Hot100刷题/
Author
Wenger
Posted on
May 13, 2025
Licensed under