一、独立做题

1.704 二分查找

leetcode上的报错是堆溢出,出错样例是[5] 5,我真的是极其疑惑:数组元素就一个咋还能堆溢出了呢,本地调试才发现, int right = sizeof(nums)/sizeof(nums[0])-1 并不能正确的计算出数组长度,这样算出来的数组长度恒为5

!对啊,vector<int>& nums是指针,用这种方法肯定只能算出固定值啊

改掉了这个错误后,新的错误又来啦,不过这次至少执行没出错,而且这个错,emmm是我经常犯的错了,[5] 5 我输出了-1.....我的确没考虑到,只有一个元素,也就是right ==left的情况,让我试试直接简单粗暴的把right>left改成right>=left试试,哈哈哈哈哈救命变成超出时间限制的错误了,我真的很好奇这调试了会是啥情况

害,原来是在元素只有一个时会陷入端点=中点的死循环中,我开始感觉我这个思路有很严重的问题了,我似乎只能再加一个非常冗余的判断去对付这个问题,加了这个看上去非常搞笑的判断后,倒是勉强AC了,这是目前AC的代码:

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right =nums.size()-1;while(right>left){int mid = (left+right)/2;if((left+right)%2==0){//区间内元素为奇数,一个中位数if(target==nums[mid]){return mid;}else if(target>nums[mid]){left=mid;}else{right=mid;}}else{//区间内元素为偶数,两个中位数if(target==nums[mid]){return mid;}else if(target==nums[mid+1]){return mid+1;}else if(target>nums[mid+1]){left=mid+1;}else if(target<nums[mid]){right=mid;}else{return -1;}}}if(right==left&&target==nums[left]){return left;}return -1;}
};

2. 27 移除元素

在调试移除元素的时候陷入了意想不到的困难中——本来觉得这题好像挺简单的,但是一做发现立刻掉坑:在删掉目标值,把数值元素整体“前移”后,for循环就直接从下一个数值开始比较了,所以如果说有连着几个都等于目标值,就会漏掉,加上了一句冗余的"i--"让每次找到相等值后就退回到当前位置后这个问题倒是勉强解决,然而,数组元素只有一个且与目标值相等时,就会陷入无限退回到当前位置的死循环中.

这也太不讲武德了,我一直把赋值为0当做“删掉”,结果测试样例里竟然出现了目标值为0的样例,这可真是太难受了,我决定去看答案了,先把目前写的代码记录下:

int removeElement(vector<int>& nums, int val) {int n = 0;for(int i=0;i<nums.size();i++){if(nums[i]==val){n++;nums[i]=0;//“删掉当前值”for(int j=i;j<nums.size()-1;j++){//注意边界值!nums[j]=nums[j+1];nums[j+1]=0;}i--;//“指针”停留在当前位置                       }}return nums.size()-n;}

好家伙,这可太打击人了,我试了试Carl写的暴力法,竟然秒过,我怎么连个暴力法都写这么长时间都写不清楚啊,而且这题的知识点其实是快慢指针啊......

对比了Carl的暴力法答案,我在写暴力循环时错在了每次for循环都是遍历的原始的数组长度,更正后能AC的代码如下:

    int removeElement(vector<int>& nums, int val) {int n = 0;for(int i=0;i<nums.size()-n;i++){if(nums[i]==val){n++;for(int j=i;j<nums.size()-1;j++){//注意边界值!nums[j]=nums[j+1];}i--;//“指针”停留在当前位置                       }}return nums.size()-n;}

二、看视频讲解

1.704 二分查找

这视频讲得真的太好了,“循环区间一致性”这真的太妙了:

我原来其实陷入了一个误区——“二分”法的重点根本不在每次搜索的区间长度都一定要是一半(根本没必要写成分奇数偶数的),而是能没有遗漏的遍历到每个可能的值,而始终保持自己定义的搜索区间都是合法、一致(都是左闭右闭或左闭右开)的就能很好的对付这个问题。

2. 27 移除元素

明明代码只有几行,但是理解起来却很费劲,拿干擦笔在塑料板上边写边擦地试图自己模拟了一下感觉也没把握要点

三、看文章讲解

1.704 二分查找

区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。

2. 27 移除元素

文字版里又提到了一个相向双指针法

* 相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素
* 时间复杂度:O(n)
* 空间复杂度:O(1)

四、重新做一遍题

1.704 二分查找

重新做题的时候感觉自己还是好傻,都没有意识到对于左闭右开的情况,直接让right=nums.size()(也就是比数组本身长一位),这样就不用对left==right的这种情况单独判断了。

2. 27 移除元素

在写相向双指针时又忘记了防溢出处理,在指针移动完毕后其实是不能保证指向的位置都是有效的,所以在更新数组前要再检查一下

为了熟悉双指针法,去做了26. 删除有序数组中的重复项,然而在自己想的时候掉入了一个搞笑的误区:我总觉得只能把右指针的指向的值复制到左指针的位置上,看了别人的题解后脑袋一嗡:卧槽原来直接复制到左指针的后一个位置上不就行了吗

如果相等,q 后移 1 位
如果不相等,将 q 位置的元素复制到 p+1 位置上,p、q均后移一位
重复上述过程,直到 q 等于数组长度。

上面这段话给我的启发特别大,几乎是照着这段话就能写出正确的代码,看来用语言描述清楚真的非常重要

走投无路的算法学习笔记|Day001相关推荐

  1. 走投无路的算法学习笔记|Day002

    目录 一.看视频/文章讲解 1.977.有序数组的平方 2.209.长度最小的子数组 3.59.螺旋矩阵II 二.无提示动手做题 1.977.有序数组的平方 2.209.长度最小的子数组 3.59.螺 ...

  2. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  3. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  4. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  5. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  6. 算法学习笔记:对指定金额计算最少钞票数

    算法学习笔记:对指定金额计算最少钞票数 一.引出问题 财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少.例如,某职工工资为3 ...

  7. matlab中x从0到5不含0,关于MATLAB的数学建模算法学习笔记

    关于MATLAB的数学建模算法学习笔记 目录 线性规划中应用: (3) 非线性规划: (3) 指派问题;投资问题:(0-1问题) (3) 1)应用fmincon命令语句 (3) 2)应用指令函数:bi ...

  8. 机器学习篇01:在线学习的支持向量机算法学习笔记

    在线学习的支持向量机算法学习笔记 oisvm算法实现说明 oisvm算法实现说明 % 本程序是用于实现基于在线学习的调制信号识别的程序 % % % 第一步:调制信号的生成 % 首先是7个信号:2ASK ...

  9. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

最新文章

  1. java socket windows linux,socket在windows下和linux下的区别
  2. 入驻支付宝开放平台并创建应用的基本流程
  3. [html] iframe父页面如何获取子页面的元素?
  4. 华为抓截屏_原来这才是华为截屏的正确姿势,今天才知道,千万别不当回事
  5. [No000014]听说不背单词,考英语会是这种下场-我们为什么必须背单词?
  6. 2015生命之旅---第二站长沙杭州
  7. c语言到底写什么系统,用C语言写关于操作系统的一个问题。
  8. 罗永浩:我是小野科技合伙人 与FLOW电子烟没有关系
  9. PHP实现9x9乘法表
  10. 【转】C++11 标准新特性: 右值引用与转移语义
  11. 又来?软件测试之接口自动化面试题汇总
  12. MATLAB算法实战应用案例精讲-【智能优化算法】蝙蝠算法-BA(附MATLAB和Python代码)
  13. 千兆以太网在国产FPGA(智多晶)上的实现
  14. 免费图书的检索和获取途径
  15. 作为学生,我是怎么半年赚到人生第一个三十万的
  16. python生词本查单词译文_GitHub - To-knowledge/Wudao-dict: 有道词典的命令行版本,支持英汉互查和在线查询。...
  17. Win8系统flash无法播放视频怎么办?
  18. MQTT-java使用说明
  19. 使用io流一行一行读取txt文件
  20. 弋江区python培训班多少钱

热门文章

  1. A Game of Thrones(29)
  2. H5公司升级改造其在克利夫兰的数据中心
  3. 工作日闹钟 android,工作日闹钟安卓版-工作日闹钟appv1.0 - 起点软件园
  4. Linux 下的仿千千静听播放器
  5. 分享一个四足蜘蛛机器人(带源码)
  6. 三元二次方程式x2+y 2=z2的正整数解x、y、z称为一组勾股数,又称为毕达哥拉斯三元数组。该方程式也称为“商高方程”或“毕达哥拉斯方程”。 试通过程序设计求指定区间[a,b]内的所有勾股数组。
  7. React 导航守卫
  8. 实现拆分一个带有空格的字符串,将其拆分之后的结果存储在字符指针数组中(C语言实现)
  9. 用命令强行杀一些顽固不化的病毒进程
  10. 015-OpenCV4(C++)USM锐化