今日计划:训练营一期day 1

注意

一般考察数组,在思维上不难,主要考察编程掌握能力

查漏补缺

1.array与vector

使用C++要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组,而array才是数组。

对题目中的vector类型的指针nums,不能使用*(nums+i),但可以使用nums[i],确定长度时应用nums.size()

sizeof(数组名)而不应该用指针名,因为地址出来的是定值

题目704-二分查找

题目链接:力扣

前提条件:已排好序,从左到右依次增大

遇到问题:vector是什么类型,如何使用它的指针nums;使用的是顺序 O(n),应该使用二分法 O(log n)

难点1:while循环中是left<right还是left<=right

答:如果是左闭右闭写法,则left<=right(合法区间),如果是左闭右开写法,则left<right(此时等于不合法)

难点2:(举例)判断完后,right=middle还是right=middle-1

答:如果是左闭右闭写法,right=middle-1(因为middle不是target,所以下一次搜索范围时不需要包含middle)

左闭右闭

//左闭右闭
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1; while(left <= right){int middle = left + (right - left) / 2;  //防止溢出,所以没直接用加法if(nums[middle] > target)right = middle -1;  //因为middle不是target,所以下一次不应该包含middleelse if(nums[middle] < target)left = middle + 1;elsereturn middle;}return -1;}
};

左闭右开

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size();while(left < right){int middle = left + (right - left) / 2;  //防止溢出,所以没直接用加法if(nums[middle] > target)right = middle;  //middle不是target,但middle-1可能是,所以右开的边界还应该是middleelse if(nums[middle] < target)left = middle + 1; //左闭elsereturn middle;}return -1;}
};

出现问题

由vector类型数组的指针nums去求数组长度时,用sizeof(nums)/sizeof(int)是错的,应用nums.size()

题目27-移除元素

题目:力扣

说明:vector中自带erase()函数可以删除元素并前移,返回--后的元素个数,但它是O(n)操作,所以不要这样解

暴力拆解法--O(n^2)

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

双指针法(重点)--O(n)

快指针是获取每个元素,进行比较,确定是否要保留到新数组

慢指针是获取需要更新到新数组中的位置信息

class Solution {
public:int removeElement(vector<int>& nums, int val) {int slow = 0;for(int fast=0; fast<nums.size(); fast++){if(nums[fast] != val){            //如果相等,slow不会更新位置,而fast会继续往下找nums[slow] = nums[fast];slow++;}}return slow;}
};

总结

对于指向vector类型的指针nums,求长度可用nums.size();如果是数组array类型,一般会传入长度,或使用sizeof(数组名)/sizeof(int)

vector和array的区别:Vector 和 Array 区别 - Kernel001 - 博客园

704-二分法:两种做法-左闭右闭和左闭右开

27-移除元素:暴力拆解可锻炼代码能力,双指针算法是精髓,要掌握。在双指针算法中,快指针是获取每个元素,进行比较,确定是否要保留到新数组;慢指针是获取需要更新到新数组中的位置信息。很多数组和链表的题中都是用双指针方法--O(n)。

训练营day01 数组 | 704-二分查找、27-移除元素相关推荐

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

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

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

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

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

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

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

    代码修炼Day1_LeetCode704二分查找&27移除元素 一些数组基本知识 数组下标都是从0开始的 数组内存空间的地址是连续的 题目链接: 力扣704二分查找 二分查找思想 针对升序数组 ...

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

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

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

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

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

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

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

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

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

    704.二分查找 题目链接:二分查找 思路: 1.从头开始遍历,首先如果不用二分查找法,最容易想到的就是直接暴力查找,时间复杂度为O(n)直接从头开始遍历一便就行.这样如果数据量庞大会运行时间较长. ...

最新文章

  1. MySQL 性能跟踪语句
  2. 基于mini2440的看门狗(裸机)
  3. 黑马程序员的课程不如兄弟连兄弟会好
  4. VTK:PolyData之KochanekSplineDemo
  5. 如何处理SAP Launchpad上tile打不开的问题
  6. 前端学习(3289):object.define2
  7. ST众泰:未与长城汽车签署过任何战略协议
  8. 六级词汇打卡第五天(五)
  9. 常用STL整理 (施工中 2017.8.11更新)
  10. 大数据与Hadoop有什么关系?大数据Hadoop入门简介
  11. Python练习题总结摘要
  12. python动力学_用python学振动分析(一)
  13. windows下使用命令打开pdf文件
  14. 人可以活很多次,但是七年就是一辈子
  15. 能够切换用户重新登录计算机,苹果电脑切换用户登录_苹果电脑切换登录账号...
  16. 计算机视觉中的双目立体视觉和体积度量
  17. 95---Python 直角坐标系下绘制双曲螺旋线
  18. 对于阶梯式矩阵(起点在左上角)
  19. [HITCON 2016]Leaking沙箱逃逸学习
  20. 【QQ登录------第三方登录的实现流程】

热门文章

  1. Linux查看系统信息命令总结
  2. linux 内存溢出排查_linux下valgrind内存问题排查
  3. linux软件 mac地址,Linux MAC地址
  4. 感性电路电流计算_「硬见小百科」一些硬件电路技术经验整理
  5. 近期缺货的晶振厂家国内替代VS国外
  6. java使用poi实现excel保护工作表实例代码(支持.xls和.xlsx)
  7. Android中APK打包流程
  8. USB 调试工具(python2.7 + Tkinter + pyusb/pywinusb)
  9. Linux AHCI驱动
  10. 第七章第三十一题(合并两个有序列表)(Merge two ordered tables)