704. 二分查找
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1 ;
int cur = (left + right)/2;
while(left <= right){
if(nums[cur] < target){
left = cur + 1;
cur = (left + right)/2;
}else if(nums[cur] > target){
right = cur - 1;
cur = (left + right)/2;
}else{
return cur;
}
}
return -1;
}
}
34. 在排序数组中查找元素的第一个和最后一个位置
69. x 的平方根
35. 搜索插入位置
public int searchInsert(int[] nums, int target) {
//左端点
int left = 0, right = nums.length-1;
int mid = left + (right-left)/2;
while(left < right){
if(nums[mid] < target){
left = mid+1;
mid = left + (right-left)/2;
}else if(nums[mid] >= target){
if(nums[mid] == target) {
return mid;
}
right = mid;
mid = left + (right-left)/2;
}
}
if(nums[nums.length-1] < target){
return right + 1;
}
return right;
}
}
852. 山脉数组的峰顶索引
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int left = 0, right = arr.length-1;
int mid = left + (right - left)/2;
while(left <= right){
if(arr[mid] < arr[mid+1] ){
left = mid+1;
mid = left + (right - left)/2;
}else if(arr[mid] < arr[mid-1]){
right = mid - 1;
mid = left + (right - left)/2;
}else{
return mid;
}
}
return -1;
}
}
162. 寻找峰值
class Solution {
public int findPeakElement(int[] nums) {
int left = 0, right = nums.length-1;
int mid = left + (right - left)/2;
//判断是否是孤山
if(nums.length == 1){
return 0;
}
//判断是否有边界的峰值
if(nums.length >= 2){
if(nums[0] > nums[1]){
return 0;
}
if(nums[nums.length-1] > nums[nums.length-2]){
return nums.length - 1;
}
}
while(left <= right){
if(nums[mid] < nums[mid+1]){
left = mid+1;
mid = left + (right - left)/2;
}else if(nums[mid] < nums[mid-1]){
right = mid - 1;
mid = left + (right - left)/2;
}else{
return mid;
}
}
return -1;
}
}
153. 寻找旋转排序数组中的最小值
class Solution {
public int findMin(int[] nums) {
int left = 0, right = nums.length - 1;
while(left < right){
int mid = left + (right-left)/2;
if(nums[mid] > nums[nums.length-1]){
left = mid + 1;
}else{
right = mid;
}
}
return nums[left];
}
}
LCR 173. 点名
class Solution {
public int takeAttendance(int[] records) {
int left = 0, right = records.length-1;
while(left < right){
int mid = left + (right - left)/2;
if(records[mid] == mid){
left = mid + 1;
}else{
right = mid;
}
}
if(records[right] == right ){
return right + 1;
}
return left;
}
}