在排序数组中查找数字_LeetCode
Posted 勇敢牛牛不怕困难@帅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在排序数组中查找数字_LeetCode相关的知识,希望对你有一定的参考价值。
LeetCode在排序数组中查找数字
来来来,讲个笑话,熟话说笑一笑十年少:
有次牙痛去看医生,医生说我的牙有点磨损,问我晚上睡觉磨不磨牙?
我说不知道啊,睡着了怎么能知道自己是不是磨牙埃
医生说:奥,单身埃
作为程序员 单身很难吗?哈哈哈哈哈
好了,现在来看一下题目:
读懂题意
这一道题目很好理解,就是统计给定target值在数组中的个数,题目也相当的容易,做这道题目的方法很多。
第一种:两层循环,遍历破解
通过两层的循环,依次遍历数组中元素是否与target相等,相等的话就计数加一。
代码:
class Solution {
public int search(int[] nums, int target) {
int count=0;
for(int i=0;i<nums.length;i++){
if(nums[i]==target){
count++;
}
}
return count;
}
}
第二种:二分查找
我们已知数组是一个有序数组,想到的办法也就是可以采用二分查找这样从算法上来讲更时间复杂度相对来说更低一点。
代码
class Solution {
public int search(int[] nums, int target) {
int left =0,right = nums.length-1;
int count = 0;
while(left<right){
int mid = (left+right)/2;
if(nums[mid]>=target)
right=mid;
if(nums[mid]<target)
left = mid+1;
}
while(left<nums.length&&nums[left++]==target)
count++;
return count;
}
}
二分查找可能难于理解的在于第二个while循环,首先我们得明白第一个while循环退出得条件是left>=righ,第一次执行第一个while循环之后是不是就能确定target一定就在left到nums.length之间,就在一个区间内,不断的刷新left的值,最理想的一种状态lnums[eft]==target,在这里为什么不能用right作为右边界呢。因为不能保证right的右边没有target的值存在,但是可以保证 target值一定是在left的右边。
另一种二分查找
class Solution {
public int search(int[] nums, int target) {
int leftIdx = binarySearch(nums, target, true);
int rightIdx = binarySearch(nums, target, false) - 1;
if (leftIdx <= rightIdx && rightIdx < nums.length && nums[leftIdx] == target && nums[rightIdx] == target) {
return rightIdx - leftIdx + 1;
}
return 0;
}
public int binarySearch(int[] nums, int target, boolean lower) {
int left = 0, right = nums.length - 1, ans = nums.length;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target || (lower && nums[mid] >= target)) {
right = mid - 1;
ans = mid;
} else {
left = mid + 1;
}
}
return ans;
}
}
以上是关于在排序数组中查找数字_LeetCode的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode]剑指 Offer 53 - I. 在排序数组中查找数字 I
[LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分)
LeetCode 剑指Offer 53 - I 在排序数组中查找数字I[二分法] HERODING的LeetCode之路