68:查找插入位置

:::info 题目:输入一个排序的整数数组nums和一个目标值t,如果数组nums中包含t,则返回t在数组中的下标;如果数组nums中不包含t,则返回将t按顺序插入数组nums中的下标。假设数组中没有相同的数字。例如,输入数组nums为[1,3,6,8],如果目标值t为3,则输出1;如果t为5,则返回2。 :::

  1. public class SearchInsert {
  2. public static int searchInsert(int[] nums, int target) {
  3. int left = 0;
  4. int right = nums.length - 1;
  5. while (left <= right) {
  6. int mid = (left + right) / 2;
  7. // nums[mid]
  8. if (nums[mid] >= target) {
  9. if (mid == 0 || nums[mid - 1] < target) {
  10. // 且nums[mid-1]小于target,那mid就是我们要找的
  11. // 如果mid已经是0了,意味着所有的数字都大于等于target,那t就插入0的位置
  12. return mid;
  13. }
  14. // 如果nums[mid-1]也是小于t,那就在mid -1 之前找
  15. right = mid - 1;
  16. } else {
  17. // 如果nums[mid]小于t,那么位置一定在mid的后面,left更新为 mid+1
  18. left = mid + 1;
  19. }
  20. }
  21. return nums.length;
  22. }
  23. public static void main(String[] args) {
  24. int[] arr = {1,2,3,5,6};
  25. System.out.println(searchInsert(arr, 4) == 3);
  26. }
  27. }

69:山峰数组的顶部

:::info 题目:在一个长度大于或等于3的数组中,任意相邻的两个数字都不相等。该数组的前若干数字是递增的,之后的数字是递减的,因此它的值看起来像一座山峰。请找出山峰顶部,即数组中最大值的位置。例如,在数组[1,3,5,4,2]中,最大值是5,输出它在数组中的下标2。 :::

  1. public class PeakIndexInMountainArray {
  2. public static int peakIndex(int[] arr) {
  3. int left = 0;
  4. int right = arr.length;
  5. while (left <= right) {
  6. int mid = (left + right) / 2;
  7. if (mid == 0 || mid == arr.length - 1) {
  8. return mid;
  9. }
  10. if (arr[mid - 1] < arr[mid] && arr[mid] > arr[mid + 1]) {
  11. return mid;
  12. }
  13. if (arr[mid] > arr[mid - 1]) {
  14. left = mid + 1;
  15. } else {
  16. right = mid - 1;
  17. }
  18. }
  19. return arr.length;
  20. }
  21. public static void main(String[] args) {
  22. int[] arr = {1, 2, 3, 2, 1};
  23. System.out.println(peakIndex(arr) == 2);
  24. int[] arr1 = {1, 2, 3};
  25. System.out.println(peakIndex(arr1) == 2);
  26. int[] arr2 = {3, 2, 1};
  27. System.out.println(peakIndex(arr2) == 0);
  28. }
  29. }