代码编织梦想

剑指 Offer 53 - I. 在排序数组中查找数字 I

题目链接

个人思路

题目条件:数组已排好序,因此下意识就要想到二分查找

思路一

  • 使用lower_bound(),找到第一个大于等于target的元素
  • 若元素不等于target,说明target在数组中不存在,返回0
  • 若元素等于target,则向后顺序遍历与target相等的元素,统计target的个数

思路一注意

  • 向后顺序遍历的过程中,注意数组访问不要越界
  • 注意当数组长度为0的特例

思路二

  • 使用两次二分查找,分别找出第一个target元素和最后一个target元素,计算出target的元素个数
  • 较易理解的二分查找(与lower_bound相比):(查找第一个target元素为例)当中间元素等于target时,判断中间元素的前一个元素是否也是target
    • 如果也是target,说明第一个target在左半段
    • 如果不是,说明此处就是第一个target

思路二注意

  • 在判断中间元素的前一个元素是否也等于target时,由于是通过nums[mid - 1]访问,所以要判断访问是否越界

个人思路代码

思路一

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(nums.size() == 0){
            return 0;
        }
        int left = 0, right = nums.size() - 1;
        while(left < right){
            int mid = (left + right) >> 1;
            if(nums[mid] >= target){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        int ans = 0;
        if(nums[left] != target){
            return ans;
        }
        int index = left;
        while(index < nums.size() && nums[left] == nums[index]){
            ans++;
            index++;
        }
        return ans;
     }
};

思路二

class Solution {
public:
    int getFirst(vector<int>& nums, int target){
        int left = 0, right = nums.size() - 1;
        while(left <= right){
            int mid = (left + right) >> 1;
            if(nums[mid] > target){
                right = mid - 1;
            }else if(nums[mid] < target){
                left = mid + 1;
            }else{
                if((mid > 0 && target != nums[mid - 1]) || mid == 0){//是第一个target
                    return mid;
                }else{ 
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
    int getLast(vector<int>& nums, int target){
        int left = 0, right = nums.size() - 1;
        while(left <= right){
            int mid = (left + right) >> 1;
            if(nums[mid] > target){
                right = mid - 1;
            }else if(nums[mid] < target){
                left = mid + 1;
            }else{
                //cout << left << " " << mid << " "  << right << endl;
                if((mid < nums.size() - 1 && target != nums[mid + 1]) || mid == nums.size() - 1){//是最后一个target
                    return mid;
                }else{ 
                    left = mid + 1;
                }
            }
            //cout << left << " " << mid << " "  << right << endl;
        }
        return -1;
    }
    int search(vector<int>& nums, int target) {
        if(nums.size() == 0){
            return 0;
        }
        int ans = 0;
        int first = getFirst(nums, target);
        int last = getLast(nums, target);
        if(first != -1 && last != -1){
            ans = last - first + 1;
        }
        //cout << first << " " << last << endl;
        return ans;
    }
};

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

ECCV 2020 论文大盘点-语义分割篇-爱代码爱编程

最近我们在总结ECCV 2020 的论文,分割类论文总计 93 篇,语义分割几乎占据半壁江山。本文包含 43 篇语义分割(Semantic Segmentation)相关论文 ,其中 oral 2 篇,spotlight 4 篇。其中一半的论文开源或将开源。 下载包含这些论文的 ECCV 2020 所有论文: ECCV 2020 论

leetcode.127.单词接龙-爱代码爱编程

文章目录 127.单词接龙代码与思路代码一代码二 127.单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则: 每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明: 如果不存在这样的转换序列,返回 0。所有

【剑指Offer】14.剪绳子-动态规划和贪婪算法-爱代码爱编程

题目描述 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 示例 1: 输入: 2

上海交大:我们做了一个医疗版MNIST数据集,发现常见AutoML算法没那么好用-爱代码爱编程

来源:机器之心 作者:魔王、张倩 上海交大研究人员创建新型开放医疗图像数据集 MedMNIST,并设计「MedMNIST 分类十项全能」,旨在促进 AutoML 算法在医疗图像分析领域的研究。 项目地址:https://medmnist.github.io/论文地址:https://arxiv.org/pdf/2010.14925v1

TinyML:下一轮人工智能革命-爱代码爱编程

作者 | Matthew Stewart 来源 | AI前线 人工智能的一个趋势是正快速从“云端”走向“边缘”。TinyML 是在海量的物联网设备端微控制器上实现的人工智能,有望在未来几年内,成为人工智能在工业领域的重要新应用。边缘设备往往计算资源和电量受限,对功耗极为敏感。在此类设备上实现人工智能模型,面临着新的挑战,也提出了新的应

算法基础十:八大基本排序-爱代码爱编程

一、交换排序 1、冒泡排序 相邻比较,交换,把最大交换到最后 /** * 冒泡排序,两两比较 * @param data */ private static void bubbleSort(int[] data){ for(int i=0;i<data.length-1;i++){

设计一个类Line,用于表示二维坐标体系中任意一条直线并输出该直线的属性-爱代码爱编程

设计一个类Line,用于表示二维坐标体系中任意一条直线并输出该直线的属性 #include<iostream> using namespace std; class line { public: void in(void); float xielv(); float lingdian(); void out(); private:

C++ 万字长文第二篇---拿下字节面试-爱代码爱编程

shared_ptr 指针的实现 template<typename T> class Shared_ptr { private: T *ptr; int *use_count; // 用指针保证指向同一块地址 public: Shared_ptr() { ptr = nullptr; use_coun

看完这篇你还能不懂C语言/C++内存管理?-爱代码爱编程

C 语言内存管理指对系统内存的分配、创建、使用这一系列操作。在内存管理中,由于是操作系统内存,使用不当会造成毕竟麻烦的结果。本文将从系统内存的分配、创建出发,并且使用例子来举例说明内存管理不当会出现的情况及解决办法。 一、内存 在计算机中,每个应用程序之间的内存是相互独立的,通常情况下应用程序 A 并不能访问应用程序 B,当然一些特殊技巧可

C++贪心算法求解找零钱问题(很形象)-爱代码爱编程

贪心算法求解找零钱问题 1.什么是贪心算法? 贪心算法是一种策略,总是做出在当前看来是最好的选择,总结出来几个字:寻找最优解 举个例子来说就是:“有一个只能往前走的果园,里边有各种水果让你免费摘,免费摘嘛当然找值钱的摘,所以一开始你就直接选择最贵的石榴,石榴摘完后再摘哪个?看看前边有香蕉和葡萄,比较了一下摘了香蕉,香蕉过后继续往前走,然后摘了橘子…

Python小技巧|如何在win系统下快速查找文件-爱代码爱编程

在工作的时候有时需要去处理一些文件,如果不在一个文件夹里面会去遍历整个盘符(如F盘),这个时候手动查找和搜索显得非常慢,单个还好,如果多个,就不得不写程序来处理了。 据我所知,Python有两个函数可以遍历文件夹(包括子文件夹),os模块的walk函数,以及glob模块的glob函数,其中os.walk函数,查看help文档有示例代码: impo

JS逆向|使用pyexecjs库替换加密字符串-爱代码爱编程

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 下面的代码是我在某网站随便找的一段base64的 javascript  源码: window = {}; window.atob = function(r) { e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn