【Leetcode题单】(01 数组篇)刷题关键点总结02【统计数组中的元素】(6题)
- 统计数组中的元素
- 645. 错误的集合 Easy
- 697. 数组的度 Easy
- 448. 找到所有数组中消失的数字 Easy
- 442. 数组中重复的数据 Medium
- 41. 缺失的第一个正数 Hard
- 274. H 指数 Medium
大家好,这里是新开的LeetCode刷题系列,以后尽量一天更新一个小章节。此系列应超过400题。
数组篇02《统计数组中的元素》,共6道题,3简单题2中等题1难题。
注意看重点部分,总结起来是这一类题的规律。
统计数组中的元素
645. 错误的集合 Easy
645. 错误的集合
public int[] findErrorNums(int[] nums) {
int[] err = new int[2];
int n = nums.length;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i = 0; i < n; i++){
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
for(int i = 1; i <= n; i++){
if(map.getOrDefault(i, 0) == 2){
err[0] = i;
}else if(map.getOrDefault(i, 0) == 0){
err[1] = i;
}
}
return err;
}
重点
- Hashmap的getOrDefault的使用
- 标记错误数组
- for循环 i 的范围
- 返回方式
697. 数组的度 Easy
697. 数组的度
public int findShortestSubArray(int[] nums) {
Map<Integer, int[]> map = new HashMap<Integer, int[]>(); // int[0] 出现次数,int[1] 起始位置,int[2]结束位置
int maxTime = 0, minLength = nums.length;
for(int i = 0; i < nums.length; i++){
if(!map.containsKey(nums[i])){
int[] arr = new int[3];
arr[0] = 1;
arr[1] = i;
arr[2] = i;
map.put(nums[i], arr);
} else {
map.get(nums[i])[2] = i;
map.get(nums[i])[0]++;
}
maxTime = Math.max(maxTime, map.get(nums[i])[0]);
}
for(int i = 0; i < nums.length; i++){
if(map.get(nums[i])[0] == maxTime){
minLength = Math.min(map.get(nums[i])[2] - map.get(nums[i])[1] + 1, minLength);
}
}
return minLength;
}
重点
- HashMap中V设为数组
- 为HashMap的value赋值方法
- HashMap的遍历
for(Map.Entry<Integer, int[]> entry : map.entrySet()){
int arr[] = entry.getValue();
if(maxTime == arr[0]){
minLength = Math.min(minLength, arr[2] - arr[1] + 1);
}
}
448. 找到所有数组中消失的数字 Easy
448. 找到所有数组中消失的数字
public List<Integer> findDisappearedNumbers(int[] nums) {
int n = nums.length;
List<Integer> l = new ArrayList<Integer>();
for(int num : nums){
int cur = Math.abs(num);
if(nums[cur - 1] > 0){
nums[cur - 1] = -nums[cur - 1];
}
}
for(int i = 0; i < nums.length; i++){
if(nums[i] > 0){
l.add(i+1);
}
}
return l;
}
重点
- 原地修改:如果发现该位出现,则置为负
List <Integer>
的使用- 使用负号做标志时,注意使用数组时将数据变为其绝对值
- Math.abs()
442. 数组中重复的数据 Medium
442. 数组中重复的数据
public List<Integer> findDuplicates(int[] nums) {
int n = nums.length;
List<Integer> l = new ArrayList<Integer>();
for(int i = 0; i < n; i++){
int x = Math.abs(nums[i]);
if(nums[x - 1] > 0){
nums[x - 1] = -nums[x - 1];
}else{
l.add(x);
}
}
return l;
}
重点
- 原地修改
- 如果发现该位出现一次,置为负数
- 再出现时判断正负,为负则出现两次
- 缩小使用空间的方式:改变数组本身
- 使用负号做标志时,注意使用数组时将数据变为其绝对值
- Math.abs()
41. 缺失的第一个正数 Hard
41. 缺失的第一个正数
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for(int i = 0; i< n; i++){
if(nums[i] <= 0){
nums[i] = n + 1;
}
}
for(int i = 0; i < n; i++){
int cur = Math.abs(nums[i]);
if(cur <= n){
if(nums[cur - 1] > 0){
nums[cur - 1] = -nums[cur - 1];
}
}
}
for(int i = 0; i < n; i++){
if(nums[i] > 0){
return i+1;
}
}
return n + 1;
}
重点
- 缩小算法所用空间的常见方式,是改变数据本身进行操作
- 首先将无用数据抛弃:置为n+1,其次遍历,利用位置,置负操作
- 返回值的科学设置,即为算法跑完未产生答案时,默认的结果
274. H 指数 Medium
274. H 指数
public int hIndex(int[] citations) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int n = citations.length, large = 0;
for(int citation : citations){
map.put(citation, map.getOrDefault(citation, 0) + 1);
if(citation > n){
large++;
}
}
int h = large;
for(int i = n; i >= 0; i--){
h += map.getOrDefault(i, 0);
if(h >= i){
return i;
}
}
return 0;
}
重点
- 倒序遍历相加,计算h
- 创建计数的hashMap,也可改为数组(官方题解),更节约时间
这个系列希望能够帮助大家提高刷题效率,发现系列算法题目的常规思路,更快a题,速通Leetcode
b站【软件柠檬】以后会不定期分享计算机领域基础知识,求职干货,为大家助力实习和春秋招offer,
公众号【软件柠檬】也会不定期更新优质内容,分享优质干货资料,希望能够帮助到大家~
❤️这里是 软件柠檬, 让我们一起学习进步~❤️