再一遍复习数组理论基础
数组定义
数组是存放在连续内存空间上的相同类型数据的集合
几点注意
- 数组的下标都是从0开始的
- 且数组内存空间的地址是连续的
- 数组的元素是不能删的,只能覆盖
二维数组的地址空间也是连续的
LeetCode704 二分查找
虽然自认为对这道题的熟悉程度已经仅次于英语单词中的abandon(好吧,突然发现abandon也懵住了,去翻译里现查的)了,果然无论啥长时间不用或者不复习都会忘,额,扯远了。。。。。。
正题:
二分查找算法的基本流程一直还记着,但今天不看答案自主做了一遍,发现对于一些细节部分仍然把握不好,在进行到折半的部分时,对于left到底是=mid还是=mid+1与right到底减不减一那里仍然迟疑了,最后经过一顿提交测试,测试出来正确答案是left=mid+1;right=mid-1;
又去看了一遍代码随想录,想起了循环不变量规则
循环不变量规则:区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理就是循环不变量规则
所以做二分查找相关的题目时需要先看定义target是在一个什么样的区间里,如在一个左右全闭区间里边界的处理方法就如上文,又如target定义在一个左闭右开区间里边界的处理方法就为left=mid+1;right=mid;
LeetCode27 移除元素
看到移除元素就想到了从随想录里学到的双指针法了,但发现对于双指针法的印象仅剩下双指针法的大概思想了,完全忘了怎么能用代码写出来了,想了半天也没捅咕出来,不得不用暴力法写出来了。复习一下双指针法吧
双指针法
双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作
快指针:寻找新数组的元素,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置
先定义一下快指针=fastIndex,慢指针=slowIndex
快指针的作用就是一直指向数组的下一个元素,它是要一直动的,即fastIndex++是随着循环一直进行,所以它会动得比较快,因此称之为“快指针”;
在本题中慢指针只有在nums[fastIndex]不等于被查找值(要被删除的元素,之后称之为value)时才会移动,即slowIndex++,当nums[fastIndex]=value时慢指针在本次循环中会停止移动,所以在它会动得比快指针慢,因此称之为“慢指针”。
而在循环过程中如果nums[fastIndex]!=value, 会执行num[slowIndex++]=nums[fastIndex] ,由于此时slowIndex<fastIndex 所以会发生覆盖。
最后fastIndex到达数组尾部后,会返回slowIndex,即为删除被删除元素后的数组下标。下面附上随想录上的双指针法动图。