1. 字典序的第k小数字(leedcode - 440)
分析(p当前位置):
- 指定前缀下的节点个数
- 如果第k个数字在当前前缀下,进一步寻找:pre *= 10, p++
- 如果第k个数字不在当前前缀下:pre ++, p += count
2. 寻找重复数(leedcode - 287)
- 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。
- 假设 nums 只有一个重复的整数 ,找出这个重复的数
- 方法一:Hashmap
- 方法二:原地归位(时间复杂度:O(n) ;空间复杂度:O(1))
- 方法三:二分法(时间复杂度:O(logn) ;空间复杂度:O(1) 同时不改动原数组)(基本思想:对于区间[1, 7],取mid = 4,遍历数组,当数组中小于等于4的个数 大于 4时,有重复)
- 假设 nums 不仅仅有一个重复的整数,找出重复次数最多的数字(多个时取最大)
/*
* 时间复杂度:O(n) 空间复杂度:O(1)
* 数组长度:n
* 数组元素:0 < m < n < 50000
* k: 数组中的最大元素 + 1
* */
public int maxRepeatNum(int[] nums, int k){
for(int i = 0; i < nums.length; i++){
nums[nums[i] % k] += k;
}
int res = -1, maxCount = 0;
for(int i = 0; i < nums.length; i++){
if(maxCount <= (nums[i] / k)){
res = i;
maxCount = nums[i] / k;
}
}
System.out.println(Arrays.toString(nums));
return res;
}
3. 多数之和
- 两数之和
- 方法一:排序,使用左右指针
- 方法二:借助hash表,key-数据,value-下标,依次遍历,判断hash表中是否存在target-当前值
- 三数之和
- 排序,三指针