
力扣刷题之二分查找
迪恩_Emma
喜欢看书的Java开发
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
215. 数组中的第K个最大元素(中等)
思路:1.暴力快排Arrays.sort()2.分治(快速排序)代码:class Solution { public int findKthLargest(int[] nums, int k) { int target=nums.length-k; int index=partition(nums,0,nums.length-1,target); return nums[index]; } private int partition(int[] nums,.原创 2021-06-09 09:02:01 · 125 阅读 · 0 评论 -
33. 搜索旋转排序数组(中等)
思路:和另外一题很类似,就算旋转了,2边也是排好序的,仍然可以用二分查找代码:class Solution { public int search(int[] nums, int target) { if(nums==null||nums.length==0) return -1; return binarySearch(nums,0,nums.length-1,target); } private int binarySearch(int[] nums,i.原创 2021-05-29 09:30:42 · 104 阅读 · 1 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字(简单)
思路:使用二分查找分成2个子数字,左子数组的下标和元素是一一对应相等的,但右子数组就不对应相等代码:class Solution { int[] nums; public int missingNumber(int[] nums) { int i=0,j=nums.length-1; while(i<=j){ int m=i+(j-i)/2; if(nums[m]==m){ i=m+1; } else{ j=m-1;.原创 2021-05-10 08:23:40 · 99 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I(简单)
思路:方法一:哈希方法二:查找target的左边界和有边界,相减即可得到长度,也就是出现的次数代码:方法一:class Solution { public int search(int[] nums, int target) { Map<Integer,Integer> map=new HashMap<>(); for(int num:nums){ if(num==target){ map.put(target,map.get.原创 2021-05-09 12:28:42 · 217 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对(困难)
思路:分治+归并代码:class Solution { int[] temp; public int reversePairs(int[] nums) { temp=new int[nums.length]; int res=mergeSort(nums,0,nums.length-1); return res; } private int mergeSort( int[] nums, int l, int r ){ if(l>=r).原创 2021-05-09 10:28:23 · 120 阅读 · 1 评论 -
剑指 Offer 11. 旋转数组的最小数字(简单)
思路:方法一:暴力求解方法二:二分查找,虽然看似无序,但是每一块(左、右区间)都是有序的代码:方法一:class Solution { public int minArray(int[] numbers) { int n=numbers.length; int min=Integer.MAX_VALUE; for(int num:numbers){ if(num<min){ min=num; } } return min;.原创 2021-04-18 11:11:43 · 209 阅读 · 0 评论