先来解释为啥用这个标题(除了蹭一点之外呢),第一个字,代表刷题的题目来源是《代码随想录》,而鼎有两种解释,一种是谐音顶(原谅作者现在还是个菜鸟),另一个也是时刻提醒自己,不能眼高手低,要切实的去刷每一道题。

今天的任务是:     数组理论基础,704. 二分查找,27. 移除元素

贴出理论基础链接:

代码随想录代码随想录PDF,代码随想录百度网盘,代码随想录知识星球,代码随想录八股文PDF,代码随想录刷题路线,代码随想录知识星球八股文https://programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

了解完基础知识,有两点收获:
1、数组的在内存空间中的地址是连续的。
2、vector是容器,它的底层实现也是array。
一、二分查找
力扣题目链接 (opens new window)

第一眼看到这个题,根据题目应该采用二分查找的方法,同时题目给了有序数组,就省去了我们自己对数组排序的步骤。如果是需要对数组排序,可以用(涉及到sort的用法,链接附上(63条消息) C++排序与sort_bool函数和sort_practical_sharp的博客-CSDN博客)

sort(nums.begin(),nums.end());
carl哥讲解链接

代码随想录

之后就自己尝试写了第一版代码

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

因为不久前刷了一遍,感觉思路是对的。。但是样例过了,提交的时候出问题了。其实自己也很清楚问题会出在哪里,再一看错误样本就直接明白了。是在只有一个元素的时候直接返回不存在了。循环条件加上  =   就可以了。

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

这是正确版。再回去看代码随想录的时候,发现自己还遗漏了一点:

nums中的所有元素是不重复的。如果可重复的话,就要再麻烦一点,因为下标可能不唯一。

当然C哥还总结了两种写法,因为我一贯用的第一种方法(全闭区间),所以一开始写的时候也是这种思路。全闭区间注意在left == right 时应有定义!!

二、移除元素

力扣题目链接 (opens new window)

这一题需要注意的点时不能使用额外的数组空间,就是只能用当前数组做事。还有不用考虑超出新长度后面的元素。其余感觉没啥坑点,但要注意的是题目中有说可以改变元素的顺序。这样子这个题目就有很多种解法了。

这是carl哥讲解链接,里面有动图,简单易懂。

代码随想录

我个人比较喜欢用双指针,将从前往后的符合的数值用后面不需要移除的数值替换的方法。以下是根据此方法写的第一版代码:

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

还是错了很多遍的,比如说没有注意到right<left的情况。还是要注意一些特殊情况的。

但是y1s1,这种方式还是比暴力解法要快的,毕竟省去了重复覆盖的过程,后续的val值也有一些直接跳过了。

我用的是相向双指针法,其实同向的双指针法也很简单,就是快指针在遇到val值时会直接跳过去,单慢指针会走这一点,并将快指针指向的,非val点的值覆盖到上面。代码如下:

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;}
};

注意点是快慢指针的距离是逐渐拉开的,理解这个应该就能理解算法了。

两道算法题大致内容就是这样,今天的题目不久前刷过一遍,感觉遇到的阻碍较少,花了一个半小时左右(加上博客),算是复习相关题目了,感觉熟练度不够,我去肝相关题目了。

刷题体验第一天——《录鼎记》第一章相关推荐

  1. 《剑指Offer》Java刷题 NO.36 两个链表的第一个公共结点(链表,等长拼接法,长者先行法,辅助栈)

    <剑指Offer>Java刷题 NO.36 两个链表的第一个公共结点(链表,等长拼接法,长者先行法,辅助栈) 传送门:<剑指Offer刷题总目录> 时间:2020-06-19 ...

  2. 改善好UI交互,创建题库,导入试题,刷题体验感

    ​​​​​UI交互调整 土著刷题微信小程序v1.1在开发方向上做了调整,完全成为一个提供围绕刷题相关功能的工具,在UI交互方面虽然参考了市面上刷题软件的UI交互,但在自己使用期间仍觉得有些别扭,所以在 ...

  3. 《录鼎记》第十三章——有史最长篇

    今日内容: 层序遍历 10 226.翻转二叉树 101.对称二叉树 2 一.二叉树的层序遍历 力扣题目链接 (opens new window) 思路一:队列实现,将根节点推入,之后在队列非空时,记录 ...

  4. C#LeetCode刷题之#387-字符串中的第一个唯一字符(First Unique Character in a String)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3939 访问. 给定一个字符串,找到它的第一个不重复的字符,并返回 ...

  5. 《录鼎记》——重启之回溯part04

    今日任务: 93.复原IP地址 78.子集 90.子集II 一.复原IP地址 力扣题目链接 (opens new window) 如果说能想到和上到题一样是切割,就有基本的思路了. 回溯三部曲:1.递 ...

  6. 《录鼎记》——重启之回溯part05

    今日任务 * 491.递增子序列 * 46.全排列 * 47.全排列 II 一.递增子序列 力扣题目链接 (opens new window) class Solution { public:vect ...

  7. 《录鼎记》——重启之回溯part03

    第七章 回溯算法part03 39. 组合总和 40.组合总和II 131.分割回文串 一.组合总和 力扣题目链接 (opens new window) 回溯三部曲 1.回溯函数参数及返回值,用par ...

  8. 力扣刷题流程-参考别人的经验觉得很有道理的

    刷题几个阶段: 1,第一遍:知道.直接看答案,不要自己想,了解所有最优解,方法技巧第一.做题套路,以印象为主. 2,第二遍:熟悉.过easy题,记住:做medium,重点题背,反复背.最简单会,大多不 ...

  9. c语言程序设计平时作业代刷,C语言程序设计——小学生口算刷题系统

    程序函数关系图 函数功能及全局变量介绍 代码中已有详细注释的地方不再进行解释. 全局变量 Cut( )函数 此函数用于分割界面,使界面更为美观. Start( )函数 此函数集成了开始菜单,年级的输入 ...

最新文章

  1. 重磅!MaxCompute助力阿里开源自研语音识别模型DFSMN,准确率高达96.04%
  2. java运行在用户态_理解Linux用户态和内核态
  3. java 月第一天_java获取当前月第一天和最后一天
  4. 收藏 | 2015年度大数据应用经典案例Top100
  5. svn文件大小类型限制,提交必须加多少字的说明
  6. 深入理解DOM节点关系
  7. win10 mysql5.7.11_Windows10安装与配置MySQL-5.7.11
  8. CentOS 7 启动与切换图形界面
  9. (转)多因子模型水平测试题
  10. 尘埃4 for Mac(DiRT4赛车竞速游戏)原生版
  11. 前端 ---- CSS基础
  12. AVR单片机与C语言的一些入门简要概述
  13. 测试用的美国信用卡账号
  14. php artisan migrate,关于laravel 5.1下php artisan migrate的使用
  15. 马尔可夫决策过程(Markov Decision Process, MDP)
  16. 修改数据库账号密码(最新版本)
  17. 基于矩阵分解的协同过滤算法
  18. 关闭计算机网络重启功能,如何按计划关闭或重启计算机
  19. 大数据平台安装实验: ZooKeeper、Kafka、Hadoop、Hbase、Hive、Scala、Spark、Storm
  20. 淘宝店铺买家订单+淘宝店铺买家订单物流获取步骤说明

热门文章

  1. 信息系统项目管理师 第一章-信息系统与信息化
  2. 抖音直播流量怎么来?四大渠道告诉你
  3. Android热修复——深入剖析AndFix热修复及自己动手实现
  4. java去掉转义字符,双引号,全角空格
  5. java代码实现短信接受验证码
  6. 谁能引爆大数据?答案是“位置大数据”
  7. keystore生成签名证书
  8. 面试笔记:面经-网易考拉
  9. 南京高中计算机老师,30个全省第一!南京老师又出名了!
  10. 计算机网络——基础篇