代码随想录:二分查找和双指针

二分查找

lc704

  • 题目lc704
  • 回忆y总的两个二分套路:acwing
  • 代码如下:
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while(left < right){int mid = (left + right) >> 1;  // 可以写成mid = left + (right - left) >> 1if(nums[mid] >= target){right = mid;}else{left = mid + 1;}}if(nums[left] == target){return left;}return -1;}
};

lc35

  • lc35
  • 思路:手写lower_bound
  • 代码
class Solution {
public:int searchInsert(vector<int>& nums, int target) {// 找第一个>=target的位置int left = 0, right = nums.size();while(left < right){int mid = (left + right) >> 1;if(nums[mid] >= target){right = mid;} else{left = mid + 1;}}return left;}
};

lc34

  • lc34
  • 和y总的二分例题一样
  • 代码
class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {if(nums.empty()){return {-1, -1};}// lower_bound和upper_bound,注意二分计算时mid的溢出// 1. 第一个位置int left = 0, right = nums.size() - 1;while(left < right){int mid = left + (right - left) / 2;if(nums[mid] >= target){right = mid;}else{left = mid + 1;}}if(nums[left] != target){// 返回[-1, -1]return {-1, -1};}int first = left;  // 记录第一个位置left = 0, right = nums.size() - 1;// 2. 最后一个位置while(left < right){int mid = left + (right - left + 1) / 2;if(nums[mid] <= target){left = mid;}else{right = mid - 1;}}// 返回结果return {first, left};}
};

lc69

  • lc69
  • 回忆浮点数二分:保证一定精度内正确;但这题使用整数二分即可
  • 代码
class Solution {
public:int mySqrt(int x) {int left = 0, right = 1e9;while(left < right){int mid = (right + left + 1) / 2;if((long long)mid * mid <= x){  // 舍去小数,所以找小于的一边left = mid;}else{right = mid - 1;}}return left;}
};

lc367

  • lc367
  • 代码
class Solution {
public:bool isPerfectSquare(int num) {// 暴力:遍历所有int看是否平方 == num;所以使用二分简化int left = 1, right = 1e9;while(left < right){int mid = (left + right) >> 1;if((long long)mid * mid >= num){right = mid;}else{left = mid + 1;}}if((long long)left * left == num){return true;}return false;}
};

快慢指针

lc27

  • lc27
  • 暴力解:双重for,遍历到val就全部元素往前移一个位置,时间复杂度为O(n^2)
  • 优化思路:弄懂快慢指针含义即可,时间复杂度为O(n)
    • fast: 原数组位置,寻找不为val值的元素
    • slow:最终的目标数组位置
    • 变化:fast指向的不是val的元素放到slow处
  • 代码
class Solution {
public:int removeElement(vector<int>& nums, int val) {int fast = 0, slow = 0; for(; fast < nums.size(); fast++){if(val != nums[fast]){nums[slow++] = nums[fast];}}return slow;}
};

lc26

  • 题目
  • 上一题的变形,主要理解快慢指针的含义和他们之间的关系
  • 代码
class Solution {
public:int removeDuplicates(vector<int>& nums) {if(nums.empty()){return 0;}// 快指针:指向原数组,找到第一个不同的元素// 慢指针:指向结果数组的位置// 如果nums[fast] != nums[fast - 1],就把这个不重复元素送到slow位置int slow = 1, fast = 1;for(; fast < nums.size(); fast++){if(nums[fast] != nums[fast -1]){nums[slow++] = nums[fast];}}return slow;}
};

lc844

  • lc844
  • 思路1:利用上面快慢指针的思想,分别得到两个最终的字符串后,再比较,时间复杂度为O(n+m);也可以用栈的思路获取最终的字符串
  • 代码:
class Solution {
public:bool backspaceCompare(string s, string t) {// 1. 先去掉退格字符int change_s = changeString(s);int change_t = changeString(t);cout << "s = " << s << " t = " << t << endl;cout << change_s << ' ' << change_t << endl;// 2. 比较前几个字符是否相同if(change_s != change_t){return false;}for(int i = 0; i < change_s; i++){if(s[i] != t[i]){return false;}}return true;}int changeString(string &str){// 返回前几个字符是有效的int slow = 0, fast = 0;for(; fast < str.size(); fast++){if(str[fast] == '#'){if(slow != 0){  // 如果slow已经在开头,不用动--slow;}} else{str[slow++] = str[fast];}}return slow;}
};

lc977

  • lc977
  • 思路:相向指针,因为负数平方从大到小,正数平方从小到大;两个指针比较即两个数的平方比较,大的一个放到目标数组中
  • 代码
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {// 暴力:平方后排序// for(auto &i : nums){//     i = i * i;// }// sort(nums.begin(), nums.end());// return nums;// 双指针:两头指针,大的放到后面int n_size = nums.size() - 1;vector<int> ret(n_size + 1);for(int i = 0, j = n_size, pos = n_size; i <= j; ){if(nums[i] * nums[i] <= nums[j] * nums[j]){ret[pos--] = nums[j] * nums[j];j--;} else{ret[pos--] = nums[i] * nums[i];i++;}}return ret;}
};

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

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

相关文章

11、内网安全-横向移动NTLM-Relay重放Responder中继攻击LdapEws

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正&#xff01; 目录 前提知识&#xff1a; 一、横向移动-NTLM 中继攻击-Relay 重放-SMB 上线 1、CS权限转给MSF: 2、MSF: 3、添加路由&#xff1a; 4、smb_relay重发模块&#xff1a; 5、受控主机输…

【算法与数据结构】797、LeetCode所有可能的路径

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;有向无环图&#xff08;Directed acyclic graph, DAG&#xff09;是图论中的一个概念&#xff0c;它指…

2 Nacos适配达梦数据库实现方案

1、修改源代码方式 Nacos 原生是不支持达梦数据库的,所以就要想办法让它 “支持”,因为是开源软件,我们可以从源码入手,在流行的 1.x 、2.x 或最新版本代码的基本上进行修改。 主要涉及到以下内容的修改: com/alibaba/nacos/persistence/datasource/ExternalDataS

js谐音梗创意小游戏《望子成龙》

&#x1f33b; 前言 龙年到来&#xff0c;祥瑞满天。愿您如龙般矫健&#xff0c;事业腾飞&#xff1b;如龙鳞闪耀&#xff0c;生活美满。祝您龙年大吉&#xff0c;万事如意&#xff01; 龙年伊始&#xff0c;我给各位设计了一款原创的小游戏&#xff0c;话不多说&#xff0c;直…

用Python和Qt实现一个登录页面

使用Python和Qt&#xff08;通常指的是PyQt或PySide&#xff09;创建一个登录界面&#xff0c;可以参考以下示例。这里我们以PyQt5为例&#xff0c;如果你使用的是PySide2&#xff0c;只需将PyQt5替换为PySide2即可。首先确保安装了PyQt5&#xff1a; pip install pyqt5接下来…

已解决[notice] A new release of pip available: 22.2 -> 22.2.2异常的正确解决方法,亲测有效!!!

已解决[notice] A new release of pip available: 22.2 -> 22.2.2异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录 问题分析 报错原因 解决思路 解决方法 总结 在使用Python进行软件开发或数据科学项目时&#xff0c;pip作为Py…

智能测径仪 针对设备自身抖动都做了哪些创新加强设计

关键字:测径仪外壳设计,测径仪内部结构,外壳刚性振动,产线共振现象,镜头纯手工擦拭清洗,测径仪智能防抖算法,测径仪多重防抖技术,测径仪防抖技术,测径仪自身防抖&#xff0c; 在生产过程中&#xff0c;被测物不可避免的会发生抖动&#xff0c;测径仪本身也会产生抖动,只是抖动幅…

Google插件Sider: ChatGPT Sidebar + GPTs GPT-4 Turbo Sider

Sider: ChatGPT Sidebar 可以使得满屏都是机器人&#xff0c;左侧栏可以打开访问GPT-4. 配置跳板机地址 google 搜索的右侧也有打开

政安晨:【示例演绎机器学习】(一)—— 剖析神经网络:学习核心的Keras API

打开这篇文章&#xff0c;相信您已经了解了TensorFlow的一些基础知识&#xff0c;可以用它从头开始实现一个简单模型。 如果您对这些概念还不是太清晰&#xff0c;可以浏览一下我这个栏目中的相关文章&#xff1a; 政安晨的机器学习笔记http://t.csdnimg.cn/DHcyL 尤其是其中…

利用LaTex批量将eps转pdf、png转eps、eps转png、eps转svg

1、eps转pdf 直接使用epstopdf命令&#xff08;texlive、mitex自带&#xff09;。 在cmd中进入到eps矢量图片的目录&#xff0c;使用下面的命令&#xff1a; for %f in (*.eps) do epstopdf "%f" 下面是plt保存eps代码&#xff1a; import matplotlib.pyplot as…

网络编程知识整理

目录 1.1 引言 1.2 分层 1.3 TCP/IP的分层 1.4 互联网的地址 1.5 域名服务 1.6 封装 1.7 分用 1.8 端口号 1.1 引言 很多不同的厂家生产各种型号的计算机&#xff0c;它们运行完全不同的操作系统&#xff0c;但 T C P / I P协议族允许它们互相进行通信。这一点很让人感…

VSCode使用教程

文章目录 VSCode简介VSCode下载安装配置语言环境CJavaPython VSCode偏好配置中文配置界面颜色字体大小快捷键 个人常规喜好 VSCode简介 VSCode&#xff08;全称&#xff1a;Visual Studio Code&#xff09;是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代…

消息中间件-面试题

MQ选择 一、Kafka 1、消息队列如何保证消息可靠性 消息不重复 生产者控制消费者幂等消息不丢失 生产者发送,要确认broker收到并持久化broker确认消费者消费完,再删除消息2、kafka是什么 Kafka是一种高吞吐量、分布式、基于发布/订阅的消息中间件,是Apache的开源项目。broke…

git版本回退在eclipse和命令中的操作

一.背景 老程序员了&#xff0c;熟悉eclipsesvn&#xff0c;git用的不溜。近几年用了git&#xff0c;偶尔修改了某个文件希望放弃本次修改重新恢复到最新版本重新修改。或者回退到某个版本&#xff0c;再修改。记录一下Eclipse中的操作&#xff0c;和命令操作的情况。 二.Ecli…

C语言KR圣经笔记 7.7行输入和输出 7.8其他函数

7.7 行输入和输出 标准库提供了一个输入例程 fgets&#xff0c;类似于我们在之前章节使用过的 getline 函数&#xff1a; char *fgets(char *line, int maxline, FILE *fp) fgets 从文件 fp 中读取下一个输入行&#xff08;包括换行符&#xff09;到字符数组 line 中&#x…

AOSP10 替换系统launcher

本文实现将原生的launcher 移除&#xff0c;替换成我们自己写的launcher。 分以下几个步骤&#xff1a; 一、新建一个自己的launcher项目。 1.直接使用android studio 新建一个项目。 2.修改AndroidManifest.xml <applicationandroid:persistent"true"androi…

【Linux 内核源码分析】内存管理——Slab 分配器

Slab 分配器 在Linux内核中&#xff0c;伙伴分配器是一种内存管理方式&#xff0c;以页为单位进行内存的管理和分配。但是在内核中&#xff0c;经常会面临结构体内存分配问题&#xff0c;而这些结构体的大小通常是小于一页的。如果使用伙伴分配器来分配这些小内存&#xff0c;…

xxl-job架构原理讲解

1、调度中心 调度中心是一个单独的Web服务&#xff0c;主要是用来触发定时任务的执行 它提供了一些页面操作&#xff0c;我们可以很方便地去管理这些定时任务的触发逻辑 调度中心依赖数据库&#xff0c;所以数据都是存在数据库中的 调度中心也支持集群模式&#xff0c;但是…

mybatis数据操作语句

//基于注解 Mapper public interface reboudapt {Select("select * from dept")List<dept> huoqudept();//删除语句Delete("delete from dept where id #{id}")void deletesc(Integer id);//增加语句Insert("insert into dept(name, create_t…

Docker镜像加速

前言 众所周知&#xff0c;我们常用的一些工具或系统的下载源都是国外的&#xff0c;这就会导致我们在下载一些东西时&#xff0c;会导致下载巨慢或者下载失败的情况&#xff0c;下面便是docker换下载源的教程 镜像加速 下面是几个常用的国内的镜像 科大镜像&#xff1a;ht…