代码随想录算法训练营第23期day1|704. 二分查找、27. 移除元素

news2025/2/27 11:11:56

目录

一、(leetcode 704)二分查找

1)左闭右开

2)左闭右闭

二、(leetcode 27)移除元素

1)暴力解法

2)双指针法

快慢指针法

双向指针


  • 数组是存放在连续内存空间上的相同类型数据的集合

1)数组下标都是从0开始的。

2)数组内存空间的地址是连续的——在删除或者增添元素的时候,要移动其他元素的地址

  • 注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组

一、(leetcode 704)二分查找

力扣题目链接

状态:暴力解法AC,新学二分查找,掌握区间边界条件

题目里提到“有序的(升序)整型数组 nums”,且无重复元素,可以考虑二分查找

1)左闭右开

  

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size(); 
        while (left < right) { // 因为left==right的时候,在[left, right)是无效空间,所以使用<
            int middle = left + (right - left)/2;
            if (nums[middle] > target) {
                right = middle; // target
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右区间,在[middle + 1, right)中
            } else { // nums[middle] == target
                return middle;
            }
        }
        return -1;
    }
};

2)左闭右闭

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=
            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) {
                right = middle - 1; // target 在左区间,所以[left, middle - 1]
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右区间,所以[middle + 1, right]
            } else { // nums[middle] == target
                return middle; 
            }
        }
        return -1;
    }
};

区间的定义就是不变量,在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则 

二、(leetcode 27)移除元素

力扣题目链接

状态:暴力解法、快慢指针法AC,双向指针思路不清需回顾

1)暴力解法

2)双指针法

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

快慢指针法

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            if (val != nums[fastIndex]) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
};

并没有改变元素的相对位置 

双向指针

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int leftIndex = 0;
        int rightIndex = nums.size() - 1;
        while (leftIndex <= rightIndex) {
            // 找左边等于val的元素
            while (leftIndex <= rightIndex && nums[leftIndex] != val){
                ++leftIndex;
            }
            // 找右边不等于val的元素
            while (leftIndex <= rightIndex && nums[rightIndex] == val) {
                -- rightIndex;
            }
            // 将右边不等于val的元素覆盖左边等于val的元素
            if (leftIndex < rightIndex) {
                nums[leftIndex++] = nums[rightIndex--];
            }
        }
        return leftIndex;   // leftIndex一定指向了最终数组末尾的下一个元素
    }
};

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

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

相关文章

HTML5编写旅游网页

网页样例&#xff1a;&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

【Java 基础篇】Java线程同步:Lock接口详解

在多线程编程中&#xff0c;线程同步是一个重要的话题。为了确保多个线程可以正确地协同工作&#xff0c;Java提供了多种线程同步机制。其中&#xff0c;Lock接口是一种强大而灵活的线程同步机制&#xff0c;它提供了比传统的synchronized关键字更多的控制和功能。本文将详细介…

mac安装chromedriver驱动详细步骤

1.查看浏览器版本 2.下载驱动 3.安装驱动 4.MacOS无法打开“chromedriver”&#xff0c;因为无法验证开发者 1.查看浏览器版本 在这里插入图片描述 2.下载驱动 下载驱动地址&#xff1a;链接: http://chromedriver.storage.googleapis.com/index.html. 下载和浏览器版本一致的…

图解直接映射(Direct mapped)、全相联(Fully-associative)和组相联(Set-associative)cache缓存基本原理

图解直接映射&#xff08;Direct mapped&#xff09;、全相联&#xff08;Fully-associative&#xff09;和组相联&#xff08;Set-associative&#xff09;cache 一&#xff0c;直接映射缓存&#xff08;Direct mapped caches&#xff09;1.1 直接映射示例1.2 直接映射原理1.3…

人类认知的贝叶斯与机器的贝叶斯

贝叶斯原理是一种基于概率的分析方法&#xff0c;可以用来估计一个事件发生的概率。在人类认知和机器学习领域中&#xff0c;都有对应的贝叶斯原理。 人类认知的贝叶斯原理&#xff1a; 在人类认知研究中&#xff0c;贝叶斯原理被认为是一种重要的思维方式。人类的认知过程通常…

算法、数据结构、计算机系统、数据库MYSQL、概率论、数学实验MATLAB、数学建模、马原、英语、杂项、QT项目

算法 冒号表达式 &#xff08;condition&#xff09;&#xff1f;x&#xff1a;y 可以三个条件 以此类推 &#xff08;condition1&#xff09;&#xff1f;x&#xff1a;&#xff08;condition2&#xff09;&#xff1f;y&#xff1a;z 判断三角形最简单的办法 bool canFormTr…

使用 K 均值聚类进行颜色分割

介绍 颜色分割是计算机视觉中使用的一种技术,用于根据颜色识别和区分图像中的不同对象或区域。聚类算法可以自动将相似的颜色分组在一起,而不需要为每种颜色指定阈值。当处理具有大范围颜色的图像时,或者当事先不知道确切的阈值时,这非常有用。 在本教程中,我们将探讨如何…

修炼离线:(三)sqoop插入hbase 报错权限问题

一&#xff1a;报错现象。 二&#xff1a;解决方式。 方法一&#xff1a;修改文件所有者。 切换hadoop用户&#xff1a;export HADOOP_USER_NAMEhdfs hadoop fs -chown -R root:root /方法二&#xff1a;修改权限 切换hadoop用户&#xff1a;export HADOOP_USER_NAMEhdfs ha…

现今主流物联网无线通信技术分类详解

无线技术正在迅速发展&#xff0c;并在人们的生活中发挥越来越大的作用。 而随着无线应用的增长&#xff0c;各种技术和设备也会越来越多&#xff0c;也越来越依赖于无线通信技术。 本文盘点下物联网中无线通信主要的技术。 一、无线通信技术的几大主流分类 1.美国通信委员会…

Fork() 函数:“父” 与 “子” 进程的交互(进程的创建)

阅读导航 前言一、fork函数初识1. 基本概念2. fork函数返回值 二、fork函数的写时拷贝三、总结温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&#xff0c;并且讲了有关C的一些知识&#xff0c;也学习了一些Linux的基本操作&#xff0c;也了解并…

CDN内容分发系统

CDN 分发系统的架构。CDN 系统的缓存&#xff0c;也是一层一层的&#xff0c;能不访问后端真正的源&#xff0c;就不打扰它。 在没有 CDN 的情况下&#xff0c;用户向浏览器输入 www.web.com 这个域名&#xff0c;客户端访问本地 DNS 服务器的时候&#xff0c;如果本地 DNS 服务…

单片机第三季-第三课:STM32开发板原理图、配置、浮点运算单元

目录 1&#xff0c;开发板原理图 2&#xff0c;浮点运算单元&#xff08;FPU&#xff09; 1&#xff0c;开发板原理图 课程视频比较早&#xff0c;介绍了三款开发板。观看视频时用的开发板说和51单片机共板的STM32核心板&#xff0c;将51单片机从底座拆下来后&#xff0c;安…

HiEV独家 | 接棒余承东,华为光产品线总裁靳玉志出任车BU CEO

作者 | 德新 编辑 | 王博 HiEV从多个信息源获悉&#xff0c;华为光产品线总裁靳玉志已于近期接任智能汽车解决方案BU CEO一职&#xff0c;而余承东担任智能汽车解决方案BU&#xff08;以下简称「车BU」&#xff09;董事长一职。 华为光产品线又称华为光传输与接入产品线&#…

基于Uniapp+SpringBoot+Vue的电影交流平台小程序设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

flink集群与资源@k8s源码分析-集群

0 介绍 本文是flink集群与资源@k8s源码分析系列的第二篇-集群 1 场景 下面详细分析各用例 2 启动k8s集群 k8s集群支持session和application模式,job模式将会被废弃,本文分析session模式集群 Configuration作为配置容器,几乎所有的构建需要从配置类获取配置项,这里不显示…

CSS浮动、定位

三种网页布局方式&#xff1a;普通流、浮动、定位 普通流&#xff1a;浏览器默认方式&#xff0c;块元素从上到下排序&#xff0c;行内元素从左到右排序&#xff08;碰到父元素的边界会自动换行&#xff09; 浮动 让一行内容纳多个盒子 核心&#xff1a;脱离普通流的控制 fl…

莱佛士设计学院 | 服装设计毕业作品欣赏(一)

这期给大家介绍了我们莱佛士学生suyao的服装设计毕业作品&#xff08;毕业设计研讨与创作课题&#xff09;——自我认同。 相信很多朋友都有看过《千与千寻》&#xff0c;这部电影以上世纪90年代日本泡沫经济时代为背景&#xff0c;千寻和她的父母误入了诡异世界后&#xff0c;…

华为数通方向HCIP-DataCom H12-831题库(单选题:81-100)

第81题 关于结构化的网络故障排除流程中的确认故障阶段的描述,正确的是? A、应关注如何更好的解决故障而不论该故障是否属于自己的负责范围。 B、应重视用户的意见,以用户的判断为依据来判断故障问题 C、应使影响最小化,尽量不让其他人知道网络出现了故障。 D、应确认排障…

make riscv.obj on x86: 交叉编译

0. 前言 最近泰晓社区捐了几块 RISCV 的开发板给 JLULUG&#xff0c;作为 JLULUG 的最菜的萌新&#xff0c;被社团领导指派来试水。我们拿到的开发板是 MILKV-DUO&#xff0c;上面跑着一个几乎极简的 buzybox linux&#xff0c;ssh 服务端用的是 dropbear。 本文内容旨在介绍…

复杂问题问答

复杂问题问答 写在最前面复杂问题问答问答系统分类 知识图谱现存问题 论文1分类 写在最前面 希望通过了解&#xff0c;找到目标应用场景的方法具体属于哪一个分支&#xff0c;并初步实现 通过阅读文献&#xff0c;找到了另一个研究方向&#xff0c;所以这个就先这样吧hh 参考…