代码编织梦想

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;
    }
}

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cout_s/article/details/118820086

在排序数组中查找数字——二分法_水泽木兰@野蛮生长的博客-爱代码爱编程

题目描述: 统计数字在排序数组中出现的次数 class Solution: def top(self, target, L): if L is None or L == []: return None if target == None: return None

面试题53:在排序数组中查找数字_fly103226的博客-爱代码爱编程

一、题目      统计一个数字在排序数组中出现的次数,例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 二、解法 思路:既然输入的数组是排序的,那么我们自然能想到用二分查找算法,如何高效的利用二分查找,可以分别利用二分查找找到第一个k和最后一个k。 class Solution { public:

53、在排序数组中查找数字-爱代码爱编程

在排序数组中查找数字 题目描述 统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 思路分析 最直观的思路即遍历整个数组,这样的效率较低。换一种思路:通过二分法查找到第一次出现查找数字的位置,类似的求出最后一次出现查找数字的位置,从而得到该数字在排序数组中出现

剑指offer53:在排序数组中查找数字-爱代码爱编程

题目1:数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数   # #方法1:count # def GetNumberOfK(data,k): # if not data or len(data)==0: # return 0 # return data.count(k) # data=[1,2,3,3,3

在排序数组中查找数字I-爱代码爱编程

在排序数组中查找数字I 1,题目:2,思路: 方法一:暴力算法: 直接拿nums[i] 和target做比较,是的话最后结果就+1 方法二:二分法 在一个循环中用nums[mid]和target的大小来判断接下来循环哪边的数组 经过以上的循环,left和right的指针,就指向target了(或者说是在target的附近了) 接着,在tar

在排序数组中查找数字-爱代码爱编程

统计一个数字在排序数组中出现的次数()。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0   限制: 0 <= 数组长度 <= 50000   思路一: 这

leetcode剑指offer 在排序数组中查找数字 java-爱代码爱编程

题目描述 统计一个数字在排序数组中出现的次数。 class Solution { public int search(int[] nums, int target) { return helper(nums,target) - helper(nums,target -1); } public int helpe

二分搜索技术--给定排好顺序的数组,找到具体的数在数组中的位置-爱代码爱编程

二分搜索技术 题目:给定排好序的n个元素a[0:n-1], 现在在这n个元素中找到一特定的元素x 分析: 分析一下,如果用顺序搜索法来找到这个数,那么需要O(n)次比较 比较浪费给定的条件——已经是排好顺序了,所以换一种思想 利用二分搜索法,即分治的思想,分成k个子问题:每次减一半,缩小范围 看代码:比较简洁 package hello; i

在排序数组中查找数字 I20210205-爱代码爱编程

在排序数组中查找数字 I *简单 题目解题 题目 统计一个数字在排序数组中出现的次数。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 限制: 0 <= 数组长度 <

iOS LeetCode☞在排序数组中查找元素的第一个和最后一个位置-爱代码爱编程

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 进阶: 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?示例 1: 输入:nums = [5,7,7,8,8,10], target = 8 输出:[

在排序数组中查找一个数字-爱代码爱编程

统计一个数字在排序数组中出现的次数。   示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0   class Solution { public: int search(vector<i

排序数组中查找数字-爱代码爱编程

有序数组中查找数字     题目:统计一个数字在排序数组中出现的次数。     思路:二分查找。由于题目给出的条件是有序数组,所以我们首先想到二分查找。     本题的难度在于,在我们找到目标元素在数组中的位置后,我们不能确定它的前面和后面的元素是不是也是跟它相同的元素,这就导致了,在我们确定二目标元素位置后,没有办法选择是向右半部分还是左半部分继续