代码随想录额外题目| 数组03 ●34排序数组查首尾位置 ●922按奇偶排序数组II●35搜索插入位置

news2024/12/25 8:51:12

#34排序数组查首尾位置

medium,我写的:1 暴力

vector<int> searchRange(vector<int>& nums, int target) {
        int start=-1;
        int end=-1;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==target && start==-1) start=i;
            if(nums[i]==target && start>-1) end=i;
        }
        return {start,end};
    }

我写的,做了个类似二分搜索的方法:

vector<int> searchRange(vector<int>& nums, int target) {
        
        int start=0;
        int end=nums.size()-1;
        int res=-1;

        while(start<=end){
            //cout<<"start: "<<start<<", end: "<<end<<endl;
            int mid=(start+end)/2;
            
            if(nums[mid]==target){
                res=mid;
                break;
            }

            if(target<nums[mid]) end=mid-1;
            if(target>nums[mid]) start=mid+1;
        }
        //cout<<res<<endl;
        start=res; end=res;
        while(start>=0 && nums[start]==target){
            start--;
        }
        while(end<nums.size() && nums[end]==target){
            end++;
        }
        
        //if(nums.size()==1) return {0,0};
        if(res==-1) return{-1,-1};
        return {start+1,end-1};
    }

随想录:从两头都做类似二分搜索

     vector<int> searchRange(vector<int>& nums, int target) {
        int leftBorder = getLeftBorder(nums, target);
        int rightBorder = getRightBorder(nums, target);
        // 情况一
        if (leftBorder == -2 || rightBorder == -2) return {-1, -1};
        // 情况三
        if (rightBorder - leftBorder > 1) return {leftBorder + 1, rightBorder - 1};
        // 情况二
        return {-1, -1};
    }
     int getRightBorder(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        int rightBorder = -2; // 记录一下rightBorder没有被赋值的情况
        while (left <= right) {
            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) {
                right = middle - 1;
            } else { // 寻找右边界,nums[middle] == target的时候更新left
                left = middle + 1;
                rightBorder = left;
            }
        }
        return rightBorder;
    }
    int getLeftBorder(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        int leftBorder = -2; // 记录一下leftBorder没有被赋值的情况
        while (left <= right) {
            int middle = left + ((right - left) / 2);
            if (nums[middle] >= target) { // 寻找左边界
                right = middle - 1;
                leftBorder = right;
            } else {
                left = middle + 1;
            }
        }
        return leftBorder;
    }

#922 按奇偶排序数组II

我的解法,有点蠢:

vector<int> sortArrayByParityII(vector<int>& nums) {
        int cnt=0;
        vector<int> odd;
        vector<int> even;
        for(int i=0;i<nums.size();i++){
            if(i%2!=0 && nums[i]%2==0) odd.push_back(i);

            if (i%2==0 && nums[i]%2!=0) even.push_back(i);
        }

        for(int i=0;i<odd.size();i++){
            swap(nums[odd[i]],nums[even[i]]);
        }

        return nums;
        
    }

inplace解法: 把odd idx放的偶数,给换到even idx放的奇数

注意j是从1开始,而且每轮i,j都是继续增加不回去

空间表现很好,但时间表现很一般

vector<int> sortArrayByParityII(vector<int>& nums) {
        int j=1;
        for(int i=0;i<nums.size();i+=2){
            if(nums[i]%2){
                while(j<nums.size() && nums[j]%2) j+=2;
                swap(nums[i],nums[j]);
            }
        }
        return nums;
    }

#35搜索插入位置 

要求复杂度O log n ,我写的:

int searchInsert(vector<int>& nums, int target) {
        int start=0;
        int end=nums.size()-1;
        while(start<=end){
            int mid=(start+end)/2;
            //cout<<"mid: "<<mid<<endl;
            if(nums[mid]==target) return mid;
            else if(mid==start) {
                if(start+1<nums.size() && target>nums[start+1]) return start+2;
                return target>nums[start]?start+1:start;
            }     
            if(nums[mid]>target) end=mid-1;
            if(nums[mid]<target) start=mid+1;
        }
        return -1;
    }

随想录写的:所有情况都能统一变成return end+1或者return start

int searchInsert(vector<int>& nums, int target) {
        int start=0;
        int end=nums.size()-1;
        int mid;
        while(start<=end){
            mid=(start+end)/2;
            if(nums[mid]==target) return mid;
               
            if(nums[mid]>target) end=mid-1;
            if(nums[mid]<target) start=mid+1;
        }
        return end+1;
    }

这里没想明白为什么不对,有空想想

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/790617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Photoshop-Beta智能版ps安装教程

Photoshop-Beta智能版ps安装教程 获取方式 安装包工具&#xff0c;关注公众号搜索 荷逸云&#xff0c;发送关键词&#xff1a;ps&#xff0c;即可获得 安装教程 0&#xff1a;注意事项 注意&#xff1a;安装此工具需要魔法上网&#xff0c;获取魔法方式&#xff1a; http…

工业以太网的发展历程与应用前景

工业以太网是在工业自动化和物联网领域广泛使用的通信网络&#xff0c;它具有应用广泛、价格低廉、通信速率高、软硬件产品丰富、应用支持技术成熟等优点&#xff0c;目前它已经在工业企业综合自动化系统中的资源管理层、执行制造层得到了广泛应用&#xff0c;并呈现向下延伸直…

数据结构和算法二(基础查找问题)

一、列表查找&#xff1a; index()&#xff0c;是线性查找&#xff0c;因为二分查找需要进行排序 1、顺序查找 def linear_search(data_set,value):for ind,val in enumerate(data_set):if valvalue:return indelse:return时间复杂度O(n)&#xff0c;从头到尾循环一遍 2、二分…

LED像素间距是什么?

像素间距是指LED显示屏上像素&#xff08;LED晶元&#xff09;之间的距离&#xff0c;也称为点间距&#xff0c;它与显示屏的分辨率相关。具体来说&#xff0c;它描述的是从某一像素的中心到相邻像素中心的距离&#xff0c;单位通常为毫米。像素间距的大小反映了两个像素之间的…

Rancher 加入集群

一、设置rancher为中文界面 1、点击右上角图标--》preferences 2、切换语言&#xff1a;默认为英文&#xff0c;切换成简体中文即可 3、切换成中文后的界面 二、导入K3S集群 1、点击导入已有集群 2、选择集群--》通用 3、输入集群的名字--》创建 4、根据下面的提示&#xff0…

PostgreSQL 查询json/jsonb是否存在某个片段

文章目录 前言实现实现思路坑1坑2坑3 恍然大悟 前言 在PostgreSQL中&#xff0c;jsonb有额外的操作符&#xff0c;如 >、<、?、?|、?& 可以用来查询是否包含路径/值&#xff0c;以及顶层键值是否存在。 详细文章&#xff1a;PostgreSQL 操作json/jsonb 那么&am…

python软件包检索办法--[推荐]

一、官方包管理网站 https://pypi.org/ 二、官网地址 官方源地址: https://pypi.org/simple 中文&#xff1a; https://pypi.com.cn/ PyPI中文网 可以参考&#xff0c;偏慢&#xff01; 三、国内源头 # 清华源 pip config set global.index-url https://pypi.tuna.tsinghua.…

【学会动态规划】礼物的最大价值(12)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

redis在linux系统安装

redis在linux系统安装&#xff1a; 1.下载压缩包 .tar.gz 2.文件安装到/opt mv .tar.gz /opt 解压文件 tar -zxvf .tar.gz 3.安装基本c环境//yum install gcc-c &#xff08;gcc -v 查看c版本&#xff09; 4.make 命令 加载环境&#xff08;make结束多src文件&#xff09;make之…

10.函数

10.1为什么需要函数 ●函数: function&#xff0c;是被设计为 执行特定任务的代码块 ●作用&#xff1a; 精简代码方便复用&#xff08;实现代码复用&#xff0c;提高开发效率&#xff09; 比如我们前面使用的alert()、prompt() 和console.log()都是一些js函数&#xff0c;只不…

gitee中fork了其他仓库,如何在本地进行同步

GitHub 操作&#xff1a;同步 Fork 来的仓库&#xff08;上游仓库&#xff09;_sigmarising的博客-CSDN博客 1. 设置upstream 2. git pull --rebase 3. 然后再执行pull、push操作

请将所有未处理的消息传递给 DefWindowProc

在之前的一篇文章中&#xff0c;我曾提到&#xff1a;如果你希望拒绝一次设备移除查询请求&#xff0c;则需要返回一个特殊的 BROADCAST_QUERY_DENY 值&#xff0c;因为太多的程序开发者认为&#xff0c;他们已经覆盖了所有 Windows 消息的处理了&#xff0c;对于其他的消息&am…

11、PHP面向对象1

1、PHP的面向对象与其他语言类似&#xff0c;但也有不同。 PHP访问成员变量时&#xff0c;需要用“->”&#xff0c;而不能用“.”&#xff0c;访问成员函数时&#xff0c;需要用“->”&#xff0c;而不能用“.”。操作符“::”可以在没有任何声明实例的情况下访问类中的…

我身边IT业40岁的老家伙们都去哪儿了?

在IT行业&#xff0c;5年&#xff0c;足够一个程序员成为大牛、或者被淘汰了。 今年34岁&#xff0c;马上就到了那个敏感的“35岁”节点&#xff0c;当程序员的第10年&#xff0c;算是比较老的程序员了。 借身边一些朋友的真实经历来说说这些40岁的老家伙们最后都去哪儿了。 …

ansible自动化运维(一)

&#x1f618;作者简介&#xff1a;正在努力的99年公司职员。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;…

Spring 6 容器 IOC 万字详解

IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Java 对象的…

Python怎么实现模式匹配

什么是模式匹配 模式匹配是一种用于在数据中寻找特定模式或结构的技术。它可以用于识别、查找和提取符合特定模式要求的数据。 在计算机科学中&#xff0c;模式匹配通常用于字符串处理和数据分析领域。一些常见的模式匹配模式包括&#xff1a; 1. 字符串匹配&#xff1a;在一…

Python输出所有的Unicode字符!

代码一点点&#xff0c;主要就是用了chr函数&#xff1a; fopen("Unicode_Entire.txt","w",encoding"utf-8") i0 while i < 205745:f.write(chr(i))i1if i 0xD800:i 0xE000 f.close()1.因为直接输出太慢&#xff0c;改为文件输出 2.D800~D…

数据可视化(1)

使用python带的matplotlib库进行简单的绘图。使用之前先进行安装&#xff0c;pip install matplotlib。如果安装了Anaconda,则无需安装matplotlib。 1.简单折线图 #绘制简单图表 import matplotlib.pyplot as plt plt.plot([1,2,3,4,5]) plt.show() import matplotlib.pyp…

使用vscode+platformio搭建arduino开发环境

存在的问题&#xff1a; Arduino编译时会将所有的C文件都编译一遍造成编译很慢&#xff0c;一个简单的工程稍加修改有可能都需要三四分钟才能编译完成&#xff0c;同时arduino也不支持代码跳转查看功能&#xff0c;不方便代码查看。 解决方法&#xff1a; 使用vscodeplatfor…