题目描述

image.png

解题思路

归并排序

  1. public int search(int[] nums, int target) {
  2. int i = 0;
  3. for (i = 1; i < nums.length; i++)
  4. if (nums[i] < nums[i - 1]) break;
  5. // 分两部分进行二分
  6. int left = search(nums, 0, i, target);
  7. if (left != -1) return left;
  8. int right = search(nums, i + 1, nums.length - 1, target);
  9. if (right != -1) return right;
  10. return -1;
  11. }
  12. public int search(int[] nums, int left, int right, int target) {
  13. while (left <= right) {
  14. int mid = (left + right) / 2;
  15. if (nums[mid] > target) {
  16. right = mid - 1;
  17. } else if (nums[mid] < target) {
  18. left = mid + 1;
  19. } else if (nums[mid] == target) return mid;
  20. }
  21. return -1;
  22. }

时间复杂度过大O(nlogn)

单指针

https://leetcode.cn/problems/sort-colors/solution/yan-se-fen-lei-by-leetcode-solution/
第一次遍历,当遇到0之后,将所有0交换在最前面,第二遍遍历把所有1放在0之后。

  1. // 单指针(2次遍历)
  2. public void sortColors(int[] nums) {
  3. int n = nums.length, ptr = 0;
  4. // 将0放在前面
  5. for (int i = 0; i < nums.length; i++) {
  6. if (nums[i] == 0) {
  7. int temp = nums[i];
  8. nums[i] = nums[ptr];
  9. nums[ptr] = temp;
  10. ptr++;
  11. }
  12. }
  13. // 将1放在0的后面
  14. for (int i = ptr; i < nums.length; i++) {
  15. if (nums[i] == 1) {
  16. int temp = nums[i];
  17. nums[i] = nums[ptr];
  18. nums[ptr] = temp;
  19. ptr++;
  20. }
  21. }
  22. }

image.png

双指针

https://leetcode.cn/problems/sort-colors/solution/yan-se-fen-lei-by-leetcode-solution/
单指针优化为双指针:
遇到1,就交换在p1位置,p1加一。
如果遇到0,此时会发现如果和p0交换0,但是此时1已经放在了这个位置,所以此时就把1给交换过去了,所以我们还要把交换出去的1再和p1交换,所以交换2次之后p1,p0都加一。

  1. public void sortColors(int[] nums) {
  2. int n = nums.length, p1 = 0, p0 = 0;
  3. for (int i = 0; i < n; i++) {
  4. if (nums[i] == 1) {
  5. int temp = nums[i];
  6. nums[i] = nums[p1];
  7. nums[p1] = temp;
  8. p1++;
  9. }
  10. else if (nums[i] == 0) {
  11. int temp = nums[i];
  12. nums[i] = nums[p0];
  13. nums[p0] = temp;
  14. // 此时交换出去的一定是1,所以需要把1交换在p1位置
  15. if (p0 < p1) {
  16. temp = nums[i];
  17. nums[i] = nums[p1];
  18. nums[p1] = temp;
  19. }
  20. p0++;
  21. p1++;
  22. }
  23. }
  24. }