1. 贪心
2.二分查找
2.1 【简单】x 的平方根 (69)

/** * 二分法 */public int mySqrt(int x) { int l = 0, r = x, ans = -1; while (l <= r) { int mid = l + (r - l) / 2; if ((long) mid * mid <= x) { ans = mid; l = mid + 1; } else { r = mid - 1; } } return ans;}
2.2 【简单】有效的完全平方数 (367)

/** * 二分法 */public boolean isPerfectSquare(int num) { int l = 0, r = num; while (l <= r) { int mid = l + (r - l) / 2; if ((long) mid * mid < num) { l = mid + 1; } else if ((long) mid * mid > num) { r = mid - 1; } else { return true; } } return false;}
2.3 【中等】搜索旋转排序数组 (33)

/** * 首元素与中间元素进行比较,分类讨论 */public int search(int[] nums, int target) { int n = nums.length; if (n == 0) { return -1; } if (n == 1) { return nums[0] == target ? 0 : -1; } int l = 0, r = n - 1; while (l <= r) { int mid = (l + r) / 2; if (nums[mid] == target) { return mid; } // 中位数先和0元素比较 if (nums[0] <= nums[mid]) { // 4,5,6,7,0,1,2,3 if (nums[0] <= target && target < nums[mid]) { r = mid - 1; } else { l = mid + 1; } } else { // 6,7,0,1,2,3,4,5 if (nums[mid] < target && target <= nums[n - 1]) { l = mid + 1; } else { r = mid - 1; } } } return -1;}
2.4 【中等】搜索二维矩阵 (74)

/** * 二分法 */public boolean searchMatrix(int[][] matrix, int target) { int m = matrix.length, n = matrix[0].length; int low = 0, high = m * n - 1; while (low <= high) { int mid = (high - low) / 2 + low; int x = matrix[mid / n][mid % n]; if (x < target) { low = mid + 1; } else if (x > target) { high = mid - 1; } else { return true; } } return false;}
2.5 【中等】寻找旋转排序数组中的最小值 (153)

/** * 与一般二分法不同,需要仔细观察记忆。 */public int findMin(int[] nums) { int low = 0; int high = nums.length - 1; // 没有等号 while (low < high) { int pivot = low + (high - low) / 2; if (nums[pivot] < nums[high]) { // 不为pivot-1 high = pivot; } else { low = pivot + 1; } } return nums[low];}