剑指Offer(leetcode)
方法1.二分
public int minArray(int[] nums) {
int n = nums.length;
int l = 0, r = n - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (nums[mid] < nums[r]) r = mid;
else if (nums[mid] > nums[r]) l = mid + 1;
else r--;
}
return nums[l];
}方法1:优先队列
public int[] getLeastNumbers(int[] arr, int k) {
PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
for (int x : arr) {
pq.offer(x);
if (!pq.isEmpty() && (pq.size() > k)) {
pq.poll();
}
}
int[] res = new int[k];
for (int i = 0; i < k; i++) res[i] = pq.poll();
return res;
}方法2:排序
剑指 Offer 40. 最小的 k 个数(基于快速排序的数组划分,清晰图解)
扩展

使用链表的方式模拟删除的操作
如果每次旋转的圈数很大,可以mod掉
按递推公式来处理
动态规划,参考**剑指 Offer 62. 圆圈中最后剩下的数字(数学 / 动态规划,清晰图解)**
方法1:回溯
Last updated