classSolution{publicintminOperations(int[] nums,int x){int len = nums.length;int[] suml =newint[len+1];int[] sumr =newint[len+1];
suml[0]= sumr[0]=0;for(int i=0;i<len;i++){
suml[i+1]= suml[i]+nums[i];
sumr[i+1]= sumr[i]+nums[len-i-1];}int ans =-1;for(int i =0;i<len+1;i++){int j =binarySearch(sumr,x-suml[i]);if(j==-1)continue;if(i+j>len)continue;if(ans==-1||ans>i+j)ans = i+j;}return ans;}intbinarySearch(int[] arr,int x){int head =0,tail = arr.length-1,mid;while(head<=tail){
mid=(head+tail)>>1;if(arr[mid]==x)return mid;if(arr[mid]<x)head = mid+1;else tail = mid-1;}return-1;}}
475. 供暖器
classSolution{//找到距离供暖器距离最远的房间的距离,相当于找第一个大于等于房间位置的供暖器publicintfindRadius(int[] houses,int[] heaters){Arrays.sort(heaters);int ans =0;for(int i:houses){int j =binarySearch(heaters,i);int a =Math.abs(heaters[j]-i);int b = j>0?i - heaters[j-1]:a+1;
ans =Math.max(ans,Math.min(a,b));}return ans;}intbinarySearch(int[] arr,int x){int head =0,tail = arr.length-1,mid;while(head<tail){
mid =(head+tail)>>1;if(arr[mid]>=x)tail = mid;else head = mid+1;}return head;}}
33. 搜索旋转排序数组
classSolution{publicintsearch(int[] nums,int target){int head =0,tail = nums.length-1,mid;while(head<=tail){
mid =(head+tail)>>1;if(nums[mid]==target)return mid;if(nums[mid]<nums[tail]){if(target<=nums[tail]&&target>nums[mid])head = mid+1;else tail = mid-1;}else{if(target<nums[mid]&&target>=nums[head])tail = mid-1;else head = mid+1;}}return-1;}}
81. 搜索旋转排序数组 II
classSolution{//先排除首尾相等的情况,确保尾部比头部小//后循进行两层if-else判断publicbooleansearch(int[] nums,int target){if(nums[0]==target||nums[nums.length-1]==target)returntrue;int l =0,r = nums.length-1;while(l<nums.length&&nums[l]==nums[0])++l;while(r>=0&&nums[r]==nums[0])--r;int head = l,tail = r,mid;while(l<=r){
mid =(l+r)>>1;if(nums[mid]==target)returntrue;if(nums[mid]<=nums[tail]){if(target<=nums[tail]&&target>nums[mid])l = mid+1;else r = mid-1;}else{if(target<nums[mid]&&target>=nums[head]) r = mid-1;else l = mid+1;}}returnfalse;}}
4. 寻找两个正序数组的中位数
//两个数组a,b判断a[k/2]和b[k/2]如果a[k/2]<b[k/2]那么a数组的前k/2元素都小于合并后的中位数,可以去除,取出后则开始找剩余的k/2元素。classSolution{publicdoublefindMedianSortedArrays(int[] nums1,int[] nums2){int n = nums1.length,m = nums2.length,mid =(n+m+1)/2;double a =findK(nums1,nums2,0,0,mid);if((n+m)%2==1)return a;double b =findK(nums1,nums2,0,0,mid+1);return(a+b)/2.0;}doublefindK(int[] nums1,int[] nums2,int i,int j,int k){if(i == nums1.length)return nums2[j+k-1];if(j == nums2.length)return nums1[i+k-1];if(k==1)return nums1[i]<nums2[j]?nums1[i]:nums2[j];int a =Math.min(k/2,nums1.length - i);int b =Math.min(k-a,nums2.length - j);
a = k - b;if(nums1[i+a-1]<=nums2[j+b-1]){returnfindK(nums1,nums2,i+a,j,k-a);}returnfindK(nums1,nums2,i,j+b,k-b);}}