代码修炼Day1_LeetCode704二分查找&27移除元素

一些数组基本知识

数组下标都是从0开始的
数组内存空间的地址是连续的

题目链接:

力扣704二分查找

二分查找思想

针对升序数组nums搜索target,设置mid,比较nums[mid]和target进行比较:
1.nums[mid] = target,返回i
2.nums[mid] > target,target应到mid左侧搜索
3.nums[mid] < target,target应到mid右侧搜索
二分查找的搜索范围是[left, right],每次用中点mid的值与target进行比较

【注】为防止溢出,mid = ( right - left ) / 2 + left

复杂度分析

时间复杂度:O(log n),其中 n 为 nums 的长度
空间复杂度:O(1)

注意一定考虑:

1.while( left < right ) 还是while( left <= right )
2.right = mid 还是 right = mid - 1
【左闭右开还是闭区间】

代码

class Solution {public:int search(vector<int>& nums, int target) {int left = 0;int 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;}
};

题目链接:

力扣27移除元素

【注】数组的元素是不能删的,只能覆盖。

暴力破解:

使用双层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组

复杂度分析:

时间复杂度:O(n^2)
空间复杂度:O(1)

代码

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

双指针法(还需加深理解)

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

  • 快指针:指向需判断的元素位置
  • 慢指针:指向需赋值的元素位置

思想:进行遍历,若快指针指向的值不为val的值(即为要输出的元素),此时需要将该值赋值给慢指针的位置,然后快慢指针同时右移一位;若快指针只想的值为val,则快指针右移一位。当快慢指针遍历数组后,慢指针的值为数组长度。

【注】因为快慢指针遍历后,慢指针赋的值与原数组顺序不变。故不改变元素的相对位置。

复杂度分析

时间复杂度: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;}
};

优化(该题目可以修改元素顺序)

由于元素顺序可以修改,可以双指针从数组两段向中间遍历,将右边不等于val的元素覆盖左边等于val的元素。
优化:需要保留的元素避免重复赋值

复杂度分析

时间复杂度:O(n),最多遍历一次数组
空间复杂度:O(1)

代码

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

代码修炼Day1_LeetCode704二分查找27移除元素相关推荐

  1. Leetcode 704.二分查找 27.移除元素 代码随想录day1

    本系列目的在于跟练代码随想录,以及记录自己在数据结构与算法方面的一些学习 704.二分查找 其实之前自己在随便刷题的时候看过这道题目,就是一个纯新手的大状态,第一次听到二分查找这样的东西,然后跟着题解 ...

  2. day1 704.二分查找 27.移除元素

    文章目录 704.二分查找 思路 代码实现 27.移除元素 思路 代码实现 704.二分查找 题目链接:704.二分查找 思路 使用二分法的前提条件: 1.有序数组 2.无重复元素 代码实现 左闭右闭 ...

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

    理论基础 1.数组是存放在连续内存空间上的相同类型数据的集合 2.数组可以方便的通过下标索引的方式获取到下标下对应的数据 3.数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要 ...

  4. 代码随想录Day01:数组理论基础、二分查找、移除元素

    目录 数组理论基础.二分查找.移除元素 1.数组理论基础 2.Leetcode704.二分查找 方法一 左闭右闭: 方法二 左闭右开: 方法三 左开右开: 方法四 左开右闭: 3.Leetcode27 ...

  5. Day01.二分查找、移除元素

    Day01.二分查找.移除元素 0704.二分查找 题目链接:0704.二分查找 思路:二分查找,仅对有序数组有效.每次需要数组的中间值,与目标值比较大小,如果中间值比目标值大,说明目标值位置在lef ...

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

    代码随想录算法Day1 | 704. 二分查找.27. 移除元素 Last edited time: April 5, 2023 11:27 AM 数据理论基础 数组是存放在连续内存空间上的相同类型数 ...

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

    704. 二分查找 题目链接:704. 二分查找 - 力扣(LeetCode) 第一天代码跑题了,做出来了但是没有使用二分法,看了讲解,对于左闭右闭和左闭右开还需要多思考,并没有完全理解.那就先总结一 ...

  8. 代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素

    今日学习的文章链接如下: 代码随想录 (programmercarl.com) 代码随想录 (programmercarl.com) 704. 二分查找 自己看到题目的第一想法 拿到题目首先想办法,一 ...

  9. 【代码随想录算法练习】| DAY01 | JavaScript | 数组理论基础,704. 二分查找,27. 移除元素

    详细解析:请看Carl老师的讲解 数组基础理论 下标从 0 开始 内存空间地址是连续的 增删元素时,会涉及其他元素地址的变动 704. 二分查找 | 点击查看力扣对应题目 二分法,也叫折半查找法,这里 ...

最新文章

  1. RHCE笔记1-安裝
  2. 非线性光纤光学_1.56 m波段高能量百飞秒光纤激光器
  3. console.log()不显示结果_RNA结合蛋白与RNA的缠绵故事,教你不做实验发文章
  4. react中的状态机_在基于状态图的状态机上使用React的模式
  5. java获取cpu使用率_2019年阿里P8架构师的解析:最新Java性能测试、调优策略
  6. webstorm使用gitee_webstorm 中 git 基本操作
  7. (SenchaTouch+PhoneGap)开发笔记(2)开发环境搭建二
  8. python调用扫描仪_使用Python编写简单的端口扫描器的实例分享
  9. rails中关于carrierwave、kaminari、roo组件分享
  10. Spring中FrameMaker中文乱码
  11. 8.认识robots.txt到爬取信息
  12. rk3288 android6,RK3288 的 Android 7.1.2 来了!
  13. java接口命名 findby getby_三 JPA复杂查询的几种方式
  14. Arduino实现数码管动态显示
  15. 基于层次分析法与熵权法的主客观组合赋权模型(原创:小青龙)
  16. 转 C# GridView中DataFormatString属性的取值
  17. (原创)模拟windows各老版本系统的宝藏网站
  18. Java工程师的职业规划,java迭代器实现原理
  19. 团队管理者是团队凝聚力的维系者。
  20. NX带边界面铣——知识点

热门文章

  1. 常用的输入字符的上标、下标、脚标
  2. 国内外旅游数据(1994-2018年)
  3. 《图算法》第七章 图算法实践-2
  4. 达梦数据库(DM)的安装教程分享
  5. 电脑文件夹怎么同步到手机?
  6. 如何让考核成为盈利工作?
  7. CodeForces 371D. Vessels
  8. 谷歌seo如何创建出色的元描述
  9. vue创建色带组件。
  10. Android图片加载出现色带