1、lc74-搜索二维矩阵 https://leetcode.cn/problems/search-a-2d-matrix/description/?envType=study-plan-v2&envId=top-100-liked
二维数组下标与一维数组下标的映射
取mid坐标防止溢出的写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Solution { public boolean searchMatrix (int [][] matrix, int target) { int m = matrix.length, n = matrix[0 ].length; int l = 0 , r = m * n - 1 ; while (l <= r){ int mid = l + (r - l) / 2 ; int mVal = matrix[mid / n][mid % n]; if (mVal == target) return true ; if (mVal < target) l = mid + 1 ; if (mVal > target) r = mid - 1 ; } return false ; } }
2、lc34-在排序数组中查找元素的第一个和最后一个位置 https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/?envType=study-plan-v2&envId=top-100-liked
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 class Solution { public int [] searchRange(int [] nums, int target) { int n = nums.length; int min = -1 , max = -1 ; int l = 0 , r = n - 1 ; while (l <= r){ int m = l + (r - l) / 2 ; if (nums[m] >= target) r = m - 1 ; else l = m + 1 ; if (nums[m] == target) min = m; } l = 0 ; r = n - 1 ; while (l <= r){ int m = l + (r - l) / 2 ; if (nums[m] <= target) l = m + 1 ; else r = m - 1 ; if (nums[m] == target) max = m; } return new int []{min, max}; } }
3、lc33-搜索旋转排序数组 https://leetcode.cn/problems/search-in-rotated-sorted-array/description/?envType=study-plan-v2&envId=top-100-liked
将数组从中间分成左右两部分,一定有一部分数组是有序的
根据有序的那部分确定该如何改变上下界
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 class Solution { public int search (int [] nums, int target) { int n = nums.length; int l = 0 , r = n - 1 ; while (l <= r) { int mid = (l + r) / 2 ; if (nums[mid] == target) { return mid; } if (nums[0 ] <= nums[mid]) { if (nums[0 ] <= target && target < nums[mid]) { r = mid - 1 ; } else { l = mid + 1 ; } } else { if (nums[mid] < target && target <= nums[n - 1 ]) { l = mid + 1 ; } else { r = mid - 1 ; } } } return -1 ; } }
4、lc153-寻找旋转排序数组中的最小值 https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/description/?envType=study-plan-v2&envId=top-100-liked
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Solution { public int findMin (int [] nums) { int n = nums.length; int l = 0 , r = n - 1 ; while (l < r){ int m = l + (r - l) / 2 ; if (nums[m] < nums[r]){ r = m; }else { l = m + 1 ; } } return nums[l]; } }
5、lc4-寻找两个正序数组的中位数 https://leetcode.cn/problems/median-of-two-sorted-arrays/description/?envType=study-plan-v2&envId=top-100-liked
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 class Solution { public double findMedianSortedArrays (int [] nums1, int [] nums2) { if (nums1.length > nums2.length) { return findMedianSortedArrays(nums2, nums1); } int m = nums1.length; int n = nums2.length; int left = 0 , right = m; int LMax = 0 , RMin = 0 ; while (left <= right) { int i = (left + right) / 2 ; int j = (m + n + 1 ) / 2 - i; int nums1LMax = (i == 0 ? Integer.MIN_VALUE : nums1[i - 1 ]); int nums1RMin = (i == m ? Integer.MAX_VALUE : nums1[i]); int nums2LMax = (j == 0 ? Integer.MIN_VALUE : nums2[j - 1 ]); int nums2RMin = (j == n ? Integer.MAX_VALUE : nums2[j]); if (nums1LMax <= nums2RMin) { LMax = Math.max(nums1LMax, nums2LMax); RMin = Math.min(nums1RMin, nums2RMin); left = i + 1 ; } else { right = i - 1 ; } } return (m + n) % 2 == 0 ? (LMax + RMin) / 2.0 : LMax; } }