代码随想录算法训练营第一天 | 704. 二分查找 27. 移除元素

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

之前就已经熟悉二分法了,有两次wa,第一次是因为一开始的右边界取了一个数为数组的长度值int r=nums.size(),终止条件是l<=r,导致数组可能越界(针对于数组为[-1],target为5的情况),r能取到的时候要注意取值;第二次wa是终止条件写成了l<r,且int r=nums.size()-1,会出现有右端点永远取不到的情况,一直取左端点,改成l<=r,最后ac。

看完题解发现:

这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。重点是区间定义。

时间复杂度是o(logn)的,而空间复杂度是o(1)的。

如果l和r是左闭,右开

// 版本二
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <int middle = left + ((right - left) >> 1);if (nums[middle] > target) {right = middle; // target 在左区间,在[left, middle)中} else if (nums[middle] < target) {left = middle + 1; // target 在右区间,在[middle + 1, right)中} else { // nums[middle] == targetreturn middle; // 数组中找到目标值,直接返回下标}}// 未找到目标值return -1;}
};

class Solution {
public:int removeElement(vector<int>& nums, int val) {int l=0;if(nums.size()==0) return 0;int r=nums.size()-1;while(l<=r){while(l<=r&&nums[l]!=val){l++;}while(l<=r&&nums[r]==val ){r--;}// if(l==r){//     return l+1;// }if(l>r) return l; swap(nums[l],nums[r]);}return l+1;}
};

这道题之前看过,所以也是挺快ac,有一次wa是因为没考虑数组为空的情况,要注意特判。是双指针法。

暴力解法是对每一个元素,判断是或不是,是的话删除移动元素。

class Solution {
public:int removeElement(vector<int>& nums, int val) {if(nums.size()==0) return 0;int res=0;for(int i=0;i<nums.size();){while(i<nums.size()&&nums[i]!=val){i++;res++;}int tmp=i;while(tmp<nums.size()&&nums[tmp]==val){tmp++;}if(tmp==nums.size()) return res;int cha=tmp-i;for(int j=i;j<nums.size()-cha;j++){// nums[j]=nums[j+cha];swap(nums[j],nums[j+cha]);}i++;res++;}return res;}
};

我第一次wa的原因是直接将后面的元素移到了前面,但是仍然可能遍历到后面,被统计,但其实该元素已经移到前面了,所以要swap。

暴力解法空间复杂度也是O(1),时间复杂度是O(n的平方)

我的是改变了相对位置的写法,以下是copy的没更改相对位置的写法。

// 时间复杂度:O(n)
// 空间复杂度:O(1)
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;}
};

今日收获:一个半小时的代码编写;要注意边界条件。

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

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

相关文章

倒计时(JS计时器)

<script>function countDown() {document.body.innerHTML ;//清空页面内容var nowTimer new Date(); //现在时间的毫秒数var valueTimer new Date("2024-1-1 12:00"); //用户输入年份倒计时时间毫秒数var timer (valueTimer - nowTimer) / 1000; //倒计时秒…

量化误差的测量

因为转换的精度有限&#xff0c;所以将模拟值数字化时会不可避免地出现量化误差。量化误差由转换器及其误差、噪声和非线性度决定。当输入信号和计数器时基有区别时就会产生量化误差。根据输入信号的相位和计数器时基的匹配程度&#xff0c;计数器有下列三种可能性&#xff1a;…

JDK 动态代理从入门到掌握

快速入门 本文介绍 JDK 实现的动态代理及其原理&#xff0c;通过 ProxyGenerator 生成的动态代理类字节码文件 环境要求 要求原因JDK 8 及以下在 JDK 9 之后无法使用直接调用 ProxyGenerator 中的方法&#xff0c;不便于将动态代理类对应的字节码文件输出lombok为了使用 Sne…

性能测试:系统架构性能优化

今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。 系统性能问题分析流程 我们首先来分析下如果一个业务系统上线前没有性能问题&#xff0c;而在上线后出现了比较严重的性能问题&#x…

Android Studio Giraffe版本遇到的问题

背景 上周固态硬盘挂了&#xff0c;恢复数据之后&#xff0c;重新换了新的固态安装了Win11系统&#xff0c;之前安装的是Android Studio 4.x的版本&#xff0c;这次也是趁着新的系统安装新的Android开发工具。 版本如下&#xff1a; 但是打开以前的Android旧项目时&#xff…

vue3 keep-alive页面切换报错:parentComponent.ctx.deactivate is not a function

问题&#xff1a; <router-view v-slot"{ Component }"><keep-alive ><component :is"Component" v-if"$route.meta.keepAlive" /></keep-alive><component :is"Component" v-if"!$route.meta.keepA…

PLC:200smart(13-16章)

PLC&#xff1a;200smart 第十三章2、带参子程序3、将子程序设置成库文件 第十三章 项目ValueValue主程序MAIN一个项目只能有一个&#xff0c;循环扫描子程序SBR_0项目中最多有128个&#xff0c;只有在调用时 才执行&#xff08;子程序可以嵌套其他子程序&#xff0c;最多八层…

STM32 启动文件分析

STM32 启动文件分析 基于STM32F103VET6芯片的 startup_stm32f10x_hd.s 启动文件分析 设置栈&#xff0c;将栈的大小Stack_Size设置为0x00004900&#xff08;18688/102418KB&#xff09;&#xff0c;即局部变量不能大于18KB。&#xff08;EQU等值指令&#xff0c;将0x0000490…

fiddler弱网测试实践

准备工作 1、fiddler安装包 2、一部安卓手机 一、fiddler安装 安装fiddler到电脑上&#xff0c;傻瓜式安装即可 二、fiddler环境配置 三、手机端环境配置 1、获取电脑的IP地址&#xff1a;WindowsR&#xff0c;输入cmd弹出命令窗口&#xff0c;输入命令ipconfig 或者鼠标…

无mac电脑生成uniapp云打包私钥证书的攻略

uniapp顾名思义是一个跨平台的开发工具&#xff0c;大部分uniapp的开发者&#xff0c;其实并没有mac电脑来开发&#xff0c;但是生成ios的证书&#xff0c;官网的教程却是需要mac电脑的&#xff0c;那么有没有办法无需mac电脑即可生成uniapp云打包的私钥证书呢&#xff1f; 下…

虚幻学习笔记1—给UI添加动画

一、前言 本文所使用的虚幻版本为5.3.2&#xff0c;之前工作都是用unity&#xff0c;做这类效果用的最多的是一个DoTween的插件&#xff0c;在虚幻中都内置集成了这这种效果制作。 图1.1 UI动画 二、过程 1、首先&#xff0c;在诸如按钮、图像等可交互控件中选中&#xff0c;如…

vue项目通过HBuilder打包成apk,实现apk自动更新下载

vue 项目通过 HBuilder 打包成 apk&#xff0c;实现 apk 自动更新下载 1、vue 项目通过 HBuilder 打包成 apk vue 项目在终端执行 npm run build 打包成 dist 文件&#xff0c;生成的 dist 文件在 项目根目录下 在 HBuilder 中 新建一个项目 默认选择 5APP 的默认模板项目…