剑指 Offer 03. 数组中重复的数字

image.png

方法1:朴素法

  1. class Solution {
  2. public int findRepeatNumber(int[] nums) {
  3. boolean[] arr = new boolean[nums.length];
  4. for (int n : nums) {
  5. if (arr[n]) return n;
  6. arr[n] = true;
  7. }
  8. return nums[0];
  9. }
  10. }

方法2:归位法

  1. class Solution {
  2. public int findRepeatNumber(int[] nums) {
  3. if (nums == null || nums.length == 0) return -1;
  4. for (int i = 0; i < nums.length; i++) {
  5. while (nums[i] != i) {
  6. int tmp = nums[i];
  7. if (nums[tmp] == tmp) return tmp;
  8. nums[tmp] = tmp;
  9. nums[i] = tmp;
  10. }
  11. }
  12. return -1;
  13. }
  14. }

剑指 Offer 40. 最小的k个数

image.png
方法1:partition法,思想和快排类似。

  1. class Solution {
  2. public int[] getLeastNumbers(int[] arr, int k) {
  3. if (arr == null || arr.length == 0) return arr;
  4. int end = arr.length - 1;
  5. int start = 0;
  6. while (start <= end) {
  7. int pivot = partition(arr, start, end);
  8. if (pivot < k - 1) {
  9. start = pivot + 1;
  10. } else if (pivot > k - 1) {
  11. end = pivot - 1;
  12. } else {
  13. break;
  14. }
  15. }
  16. int[] res = new int[k];
  17. for (int i = 0; i < k; i++) {
  18. res[i] = arr[i];
  19. }
  20. return res;
  21. }
  22. private int partition(int[] arr, int start, int end) {
  23. int v = arr[start];
  24. int j = start; //[start+1, j] < v
  25. for (int i = start + 1; i <= end; i++) {
  26. if (arr[i] < v) {
  27. swap(arr, i, ++j);
  28. }
  29. }
  30. swap(arr, start, j);
  31. return j;
  32. }
  33. private void swap(int[] arr, int i, int j) {
  34. int tmp = arr[i];
  35. arr[i] = arr[j];
  36. arr[j] = tmp;
  37. }
  38. }

方法2:使用大顶堆

  1. class Solution {
  2. public int[] getLeastNumbers(int[] arr, int k) {
  3. if (k < 1) return new int[0];
  4. if (k >= arr.length) return arr;
  5. PriorityQueue<Integer> queue = new PriorityQueue<Integer> ((k1, k2) -> k2.compareTo(k1));
  6. for (int e : arr) {
  7. if (queue.size() < k) {
  8. queue.add(e);
  9. } else if (queue.peek() > e){
  10. queue.poll();
  11. queue.add(e);
  12. }
  13. }
  14. int[] res = new int[k];
  15. for (int i = 0; i < k; i++) {
  16. res[i] = queue.poll();
  17. }
  18. return res;
  19. }
  20. }