*/ class Solution { public int[] searchRange(int[] nums, int target) { int a = lower_bound(nums,target); if(a >= nums.length || nums[a] != target){ return new int [] {-1,-1}; }
int b = lower_bound(nums,target + 1) - 1; // a 存在那么b一定存在 因为大不了 a == b return new int [] {a,b}; }
// >= // 闭区间写法 [l,r] public int lower_bound(int [] arr, int x){ int l = 0 , r = arr.length - 1; while(l <= r){ int mid = l + r >>1; if(arr[mid] >= x){ // l x mid r // [l , mid - 1] r = mid - 1; }else{ // l mid x r // [mid + 1 , r] l = mid + 1; } }
/** 双重判断 还是与最后一个数last 比较 记录要寻找的数为 x x > last 则证明存在x 而如果mid >= x 则证明x 位于 l mid 这一段 否则 x 位于 mid + 1 , r 这一段 */ classSolution { publicintsearch(int[] nums, int target) { intn= nums.length; // n - 1 为last 不加入 比较 intl=0 , r = n - 2; while(l <= r){ intmid= l + r >> 1; if(check(nums,target,mid)){ r = mid - 1; }else{ l = mid + 1; } }
if(l >= n || nums[l] != target){ return -1; }
return l; }
publicbooleancheck(int [] arr,int target , int mid){ intlast= arr[arr.length - 1]; // mid >= last // mid 此时处于last 右边 l last mid r // r = mid - 1 if(arr[mid] >= last){ // target 与 mid 属于 同区间 // l (last) mid r last // l target mid r last // 即可以确定mid 右边为另外一种性质的序列 且target与mid处于同种性质的序列中 return target > last && arr[mid] >= target; }else{ // l mid last r // 如果target > last l mid (last) target r 因为是有序递增的 证明 target处于第一个有序递增区间 即mid 的右边是另外一种性质的序列 // 如果 arr[mid] >= target // l target mid (last) r 则证明mid target均属于第一个有序递增区间 即mid 右半部分为另外一种性质序列 return target > last || arr[mid] >= target; } } }
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode *` Right *TreeNode * } */ funcclosestNodes(root *TreeNode, queries []int) [][]int { var inorder func(root *TreeNode) q := []int{} inorder = func(root *TreeNode){ if root == nil { return } inorder(root.Left) q = append(q,root.Val) inorder(root.Right) } inorder(root) ans := [][]int{} for _,v := range queries{ a := sort.SearchInts(q,v + 1) - 1 b := sort.SearchInts(q,v) if a >= len(q) || a < 0{ a = -1 }else{ a = q[a] if a > v{ a = -1 } } if b >= len(q) { b = -1 }else{ b = q[b] if b < v { b = -1 } }
intminimumSize(vector<int>& nums, int maxOperations){ int l = 0 , r = *max_element(nums.begin(),nums.end()); while(l < r){ int mid = l + r >> 1; if(check(mid,maxOperations,nums)){ r = mid; }else{ l = mid + 1; } }