StrStr Basics
- 1. StrStr实现
- 2. Subsets I, II
- 3. Permutations I, II
- 4. Combination Sum
Binary Search
- 1. Search in rotated sorted array
- 1*. Search in Rotated Sorted Array II
- 2. Find peak element
- 3. Peak Index in a Mountain Array
- 4. Smallest Rectangle Enclosing Black Pixels LintCode 600
33. Search in Rotated Sorted Array
有两个基本的情况,就是low-T-mid 和mid-T-high,如果属于这两种基本的情况,则按照基本的二分法缩小rank;如果不是,则无脑把range切换到另一边。
注意,在一个已经旋转过的数组里面,不符合要求的另一边的形态和最开始的形态是一样的(两个上升区间)。
class Solution {
public int search(int[] nums, int target) {
if(nums == null || nums.length == 0){
return -1;
}
int left = 0;
int right = nums.length - 1;
while (left <= right){
int mid = (left + right) / 2;
if(nums[mid] == target){
return mid;
}
if (nums[mid] < nums[right]){
if(target > nums[mid] && target <= nums[right]){
left = mid + 1;
} else {
right = mid - 1;
}
} else {
if (target >= nums[left] && target < nums[mid]){
right = mid - 1;
} else {
left = mid + 1;
}
}
}
return -1;
}
}
LintCode 75. Find Peak Element
因为题目给了第1个元素比第0个元素要大,并且倒数第二个元素也比最后一个元素大,那么这个数组肯定是有一个峰值的。
用二分法的思路:先找中点,看看中点是不是peak。然后看左右两边哪边数字大,数字大的那边肯定是有一个peak的。
public class Solution {
/**
* @param A: An integers array.
* @return: return any of peek positions.
*/
public int findPeak(int[] A) {
// write your code here
if(A==null || A.length == 0){
return -1;
}
int left = 0;
int right = A.length - 1;
while(left <= right){
int mid = (left +right) / 2;
if (isPeak(mid, A)){
return mid;
}
if (mid + 1 < A.length && A[mid] < A[mid+1]){
left = mid + 1;
continue;
}
if (mid - 1 >= 0 && A[mid] < A[mid-1]){
right = mid - 1;
continue;
}
}
return -1;
}
private boolean isPeak (int index, int[] nums){
if (nums.length == 1){
return true;
}
if (index == 0 || index == nums.length - 1){
return false;
}
if (nums[index] > nums[index-1] && nums[index] > nums[index+1]){
return true;
} else {
return false;
}
}
}
153. Find Minimum in Rotated Sorted Array
我的post:LeetCode论坛
81. Search in Rotated Sorted Array II
粪题。。。直接O(n)用for循环。。。本题考点不在二分法,因为“Most implementations of binary search assume that the target array has no duplicates.”
LintCode 600. Smallest Rectangle Enclosing Black Pixels
在一个2D矩阵中会有唯一的由黑色像素点构成的孤岛,会给你一个点的坐标。
思路:根据这个点的坐标展开,分别对左边右边上面下面进行二分查找,找到最大延伸的位置。九章算法。
周末复习情况:
SubsetsII要注意有重复元素的数组的排序问题,因为如果不排序的话完全没法用i > start && nums[i] == nums[i-1]来除重。其他题目一次过。