【C++代码】二分查找,移除元素

news2024/10/2 20:38:10

题目:二分查找

  • 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
题解
  • 在升序数组 nums \textit{nums} nums 中寻找目标值 target \textit{target} target,对于特定下标 i,比较 nums [ i ] \textit{nums}[i] nums[i] target \textit{target} target 的大小:

    • 如果 nums[i]=target,则下标 i 即为要寻找的下标;

    • 如果 nums[i]>target,则 target 只可能在下标 i 的左侧;

    • 如果 nums[i]<target,则 target 只可能在下标 i 的右侧。

  • 二分查找的做法是,定义查找的范围 [ left , right ] [\textit{left}, \textit{right}] [left,right],初始查找范围是整个数组。每次取查找范围的中点 mid,比较 nums [ mid ] \textit{nums}[\textit{mid}] nums[mid] 和 target 的大小,如果相等则 mid 即为要寻找的下标,如果不相等则根据 nums[mid] 和 target 的大小关系将查找范围缩小一半。由于每次查找都会将查找范围缩小一半,因此二分查找的时间复杂度是 O ( log ⁡ n ) O(\log n) O(logn),其中 n 是数组的长度。

  • 二分查找的条件是查找范围不为空,即 left ≤ right \textit{left} \le \textit{right} leftright。如果 target 在数组中,二分查找可以保证找到 target,返回 target 在数组中的下标。如果 target 不在数组中,则当 left > right \textit{left} > \textit{right} left>right 时结束查找,返回 −1。

  • #include<iostream>
    #include<vector>
    using namespace std;
    int search_binary(vector<int>nums, int target)
    {
    	int left=0,right=nums.size()-1;
            while(left<=right){
                int mid = (right-left)/2+left;
                int num = nums[mid];
                if(num==target)
                    return mid;
                else if (num>target)
                    right = mid-1;
                else
                    left = mid+1;
            }
            return -1;
    }
    int main()
    {
       	vector<int>v{ 8,11,19,23,27,33,45,55,67,98 };
    	cout << search_binary(v, 19);
       	return 0;
    }
    
  • mid索引计算优化,可用位运算

    • int mid = left&right+(left^right)>>1;//效率略高
      

      作者:力扣官方题解
      链接:https://leetcode.cn/problems/binary-search/solutions/980494/er-fen-cha-zhao-by-leetcode-solution-f0xw/

题目:移除元素

  • 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
题解
  • 由于题目要求删除数组中等于 val 的元素,因此输出数组的长度一定小于等于输入数组的长度,我们可以把输出的数组直接写在输入数组上。可以使用双指针:右(快)指针 right 指向当前将要处理的元素,左(慢)指针 left 指向下一个将要赋值的位置

    • 如果右指针指向的元素不等于 val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;

    • 如果右指针指向的元素等于 val,它不能在输出数组里,此时左指针不动,右指针右移一位

  • 整个过程保持不变的性质是:区间 [0,left) 中的元素都不等于 val。当左右指针遍历完输入数组以后,left 的值就是输出数组的长度。这样的算法在最坏情况下(输入数组中没有元素等于 val,左右指针各遍历了数组一次

  • 在这里插入图片描述

  • 时间复杂度:O(n),其中 n 为序列的长度。我们只需要遍历该序列至多两次。空间复杂度:O(1)。我们只需要常数的空间保存若干变量。

  • #include<iostream>
    #include<vector>
    using namespace std;
    int removeElement(vector<int>& nums, int val) {
    	int fast =0,slow=0;
    	for(fast;fast<nums.size();fast++){
    		if(nums[fast]!=val){
    			nums[slow] = nums[fast];
    			slow++;
    		}
    	}
    	return slow;
    }
    int main()
    {
       	vector<int>v{ 8,11,19,23,19,33,45,19,67,19 };
    	cout << removeElement(v, 19);
       	return 0;
    }
    
  • 暴力删除法

    • class Solution {
      public:
          int removeElement(vector<int>& nums, int val) {
           int n=nums.size();
              for(int i=0;i<n;i++)
              {
                  if(nums[i]==val)
                  {
                      for(int j=i+1;j<n;j++)
                      {
                          nums[j-1]=nums[j];
                      }
                       i--;
                       n--;
                  } 
              }
              return n;
          }
      };
      
  • 迭代器删除法

    • class Solution {
      public:
          int removeElement(vector<int>& nums, int val) {
              for(vector<int>::iterator iter=nums.begin();iter!=nums.end();iter++)
              {        //从vector中删除指定的某一个元素 
                  if(*iter==val)
                  {
                       iter= nums.erase(iter);
                       iter--;
                   }
              }
              return nums.size();
          }
      };
      

数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标下对应的数据。代码随想录 (programmercarl.com)

  • 在这里插入图片描述

    • 数组下标都是从0开始的;

    • 数组内存空间的地址是连续的.

  • 使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。数组的元素是不能删的,只能覆盖

  • 二维数组在内存的空间地址是连续的么?

    • 不同编程语言的内存管理是不一样的,以C++为例,在C++中二维数组是连续分布的。

    • #include <iostream>
      #include <vector>
      using namespace std;
      void test_arr() {
          int array[2][3] = {
      		{0, 1, 2},
      		{3, 4, 5}
          };
          cout << &array[0][0] << " " << &array[0][1] << " " << &array[0][2] << endl;
          cout << &array[1][0] << " " << &array[1][1] << " " << &array[1][2] << endl;
      }
      int main() {
          test_arr();
      }
      
    • 在这里插入图片描述

    • 0x7ffd58fb62f0 与 0x7ffd58fb62f4 差了一个4,就是4个字节,因为这是一个int型的数组,所以两个相邻数组元素地址差4个字节。

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

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

相关文章

Linux安装mysql ( ARM架构,rpm包)

下载对应的mysql 阿里源&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 华为开源镜像站_软件开发服务_华为云 华为源&#xff1a; 华为开源镜像站_软件开发服务_华为云 选择华为鲲鹏镜像 https://repo.huaweicloud.com/kunpeng/yum/el/7/aarch64/ 下载mysql wg…

【3ds Max】练习——制作衣柜

目录 步骤 一、制作衣柜顶部 二、制作衣柜门板 三、制作衣柜底部 四、制作柜子腿部 五、制作柜子底板 步骤 一、制作衣柜顶部 1. 首先创建一个平面&#xff0c;然后将图片素材拖入平面 2. 平面大小和图片尺寸比例保持一致 3. 单机鼠标右键&#xff0c;选择对象属性 勾选…

简历考察点2_《CiCi-基于Vue3.0的智能音乐分享平台》

&#xff08;1&#xff09;项目初始化和推荐页面开发&#xff1a; 重点&#xff1a;轮播图、Scroll、下拉加载方法实现、 问题一&#xff1a;轮播图实现 ① 获取轮播图数据&#xff1a;虽然找到接口了&#xff0c;但是由于XHR请求在浏览器端会有跨域的限制&#xff0c;不能直…

8_分类算法-k近邻算法(KNN)

文章目录 1 KNN算法1.1 KNN算法原理1.2 KNN过程1.3 KNN三要素1.4 KNN分类预测规则1.5 KNN回归预测规则1.6 KNN算法实现方式&#xff08;重点&#xff09;1.7 k近邻算法优缺点 2 KD-Tree2.1 KD Tree构建方式2.2 KD Tree查找最近邻2.3 KNN参数说明 1 KNN算法 定义&#xff1a;如…

fineReport10问题笔记

1. word导出相关问题 1.1 导出文字为图片 fineReport技术文档 1&#xff09;文本控制 选中单元格&#xff0c;点击「单元格属性>样式>对齐」&#xff0c;文本控制设置有四种&#xff0c;分别为「自动换行、单行显示、单行显示&#xff08;调整字体&#xff09;、多行显…

AA实验是什么?

AA实验是什么&#xff1a;AA实验是在AB实验正式上线前做的分流均匀性检验&#xff0c;这个时候还没有正式上实验策略&#xff0c;只是为了检验两组的分流是否均匀先空跑一段时间。 AA实验的准备工作&#xff1a;这个时候要进行的工作是检查 两组分流是否均匀 、埋点是否正常 。…

精益求精:通付盾安卓应用加固升级,为移动安全保驾护航!

在如今竞争激烈的移动应用领域&#xff0c;保障应用资源的安全性成为刻不容缓的任务。最近&#xff0c;通付盾针对资源加密方案进行了全面升级&#xff0c;大幅增强了其兼容性&#xff0c;实现了更全面的资源文件类型保护。这次升级为移动应用的安全性和稳定性迈出了坚实的一步…

driver‘s license exam 2

机动车科目二内容 driver‘s license exam 1_spencer_tseng的博客-CSDN博客 driver‘s license exam 2_spencer_tseng的博客-CSDN博客 driver‘s license exam 3_spencer_tseng的博客-CSDN博客 driver‘s license exam 4_spencer_tseng的博客-CSDN博客 car indicator light…

跨平台图表:ChartDirector for .NET 7.1 Crack

什么是新的 ChartDirector for .NET 7.0 支持跨平台使用&#xff0c;但仅限于 .NET 6。这是因为在 .NET 7 中&#xff0c;Microsoft 停止了用于非 Windows 使用的 .NET 图形库 System.Drawing.Common。由于 ChartDirector for .NET 7.0 依赖于该库&#xff0c;因此它不再支持 .…

物通博联嵌入式数据采集网关采集传感器的数据上传到云端

在当今的物联网&#xff08;IoT&#xff09;时代&#xff0c;各种传感器广泛应用于各种工业领域。传感器数据采集是实现自动化生产的基础&#xff0c;可以为企业决策提供科学的数据支持&#xff0c;通过各类智能传感器采集传输终端&#xff0c;将采集的传感器数据实时传输到设备…

2048. 下一个更大的数值平衡数;1292. 元素和小于等于阈值的正方形的最大边长;2707. 字符串中的额外字符

2048. 下一个更大的数值平衡数 核心思想&#xff1a;枚举直接从n1开始枚举它是不是平衡数即可。 1292. 元素和小于等于阈值的正方形的最大边长 核心思想:枚举正方形的左上角优化。优化部分有两部分&#xff0c;第一部分是计算面积的优化&#xff0c;预先处理好g&#xff0c;让…

LVS集群 (NET模式搭建)

目录 一、集群概述 一、负载均衡技术类型 二、负载均衡实现方式 二、LVS集群结构 一、三层结构 二、架构对象 三、LVS工作模式 四、LVS负载均衡算法 一、静态负载均衡 二、动态负载均衡 五、ipvsadm命令详解 六、搭建实验流程 一、首先打开三台虚拟机 二、…

SpreadsheetGear 2017 2023 for .NET Crack

SpreadsheetGear 2017 & 2023 for .NET Crack Spreadsheet Gear for.NET被描述为允许用户和开发人员使用iOS、Android、Mac OS、Linux&#xff0c;最后是UWP&#xff0c;以利用可扩展的Excel报告以及与图表API兼容的全面Excel&#xff0c;以及为用户和开发人员提供的最快、…

Rancher证书更新

一、环境 主机名 IP地址 操作系统 rancher版本 K8s-Master 192.168.10.236 Centos 7 2.5.9 二、更新证书 1、查看当前证书到期时间 2、进行证书轮换 [rootK8s-Master ~]# docker ps |grep rancher/rancher d581da2b7c4e rancher/rancher:v2.5.9 …

appium2.0+ 单点触控和多点触控新的解决方案

在 appium2.0 之前&#xff0c;在移动端设备上的触屏操作&#xff0c;单手指触屏和多手指触屏分别是由 TouchAction 类&#xff0c;Multiaction 类实现的。 在 appium2.0 之后&#xff0c;这 2 个方法将会被舍弃。 "[Deprecated] TouchAction action is deprecated. Ple…

【25考研】- 整体规划及高数一起步

【25考研】- 整体规划及高数一起步 一、整体规划二、专业课870计算机应用基础参考网上考研学长学姐&#xff1a; 三、高数一典型题目、易错点及常用结论&#xff08;一&#xff09;典型题目&#xff08;二&#xff09;易错点&#xff08;三&#xff09;常用结论1.arcsinxarccos…

Python爬虫实战案例——第二例

某某美剧剧集下载(从搜索片名开始) 本篇文章主要是为大家提供某些电影网站的较常规的下载电影的分析思路与代码思路(通过爬虫下载电影)&#xff0c;我们会从搜索某部影片的关键字开始直到成功下载某一部电影。 地址&#xff1a;aHR0cHM6Ly93d3cuOTltZWlqdXR0LmNvbS9pbmRleC5od…

为什么选择网络安全?为什么说网络安全是IT行业最后的红利?

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

60.每日一练:回文数(力扣)

目录 问题描述 代码解决以及思想 解法&#xff08;一&#xff09; 知识点 解法&#xff08;二&#xff09; 问题描述 代码解决以及思想 解法&#xff08;一&#xff09; class Solution { public:bool isPalindrome(int x) {string arr to_string(x); // 将整数转换为…

IDEA常用插件之代码扫描SonarLint

文章目录 SonarLint 查找隐藏的bug下载安装插件扫描代码查看结果 SonarLint 查找隐藏的bug 下载安装插件 扫描代码 项目右键 -> Analyze -> Analyze with SonarLint 查看结果 扫描完成结果在下面可以直接查看到报告