二分查找无序数组的峰值
162. 寻找峰值
class Solution {
/**
寻找峰值
*/
public int findPeakElement(int[] nums) {
int res = Integer.MIN_VALUE;
int len = nums.length;
// 边界条件
if(len == 1){
return 0;
}
// 查找算法
return binarySearch(0,len-1,nums);
}
/**
二分法
就是去找最大值
如果 [mid] <[mid+1] 选择向右的方向 寻找最大值 left = mid +1
如果 [mid] >[mid+1] 选择向左的方向 寻找最大值 right = mid
*/
public int binarySearch(int left,int right,int nums[]){
while(left<right){
int mid = (left+right)/2;
// [low.... mid....high]
if(nums[mid]>nums[mid+1]){
// [low.... mid. mid+1...high]
//向左寻找最大值
right = mid;
}else{
//这个是小于的情况 [low.... mid. mid+1...high]
//就沿着向后找一个最大的,就是我不管前面有没有最大的
left = mid+1;
}
}
return left;
}
}
678. 有效的括号字符串
难点在于*可以被看做)或者( 或者一般字符。
贪心算法,以left“(”的数量为切入点。
class Solution {
/**
“(”作为入手点,“*”可以为“(”
因此 可以设置两个变量 maxleft 和 minleft
如果发现
*/
public boolean checkValidString(String s) {
char[] cs = s.toCharArray();
int maxleft = 0;
int minleft = 0;
for(char c:cs){
if(c =='('){
//得到一个left
minleft++;
maxleft++;
}else if(c