代码随想录day1
数组
《代码随想录》数组:数组理论基础
数组是存放在连续内存空间上的相同类型数据的集合。
需要两点注意的是
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
- 那么二维数组在内存的空间地址是连续的么?
c++是,java不是。
《代码随想录》数组:二分查找
四号标题
题解经常出现的lowerBound是C++stl里的一种算法,返回第一个大于等于的下标。
704. 二分查找
这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件.
int mid = left + ((right - left) >> 1);
的效果和
int mid = left + ((right - left) /2 );
一样,但是使用位运算通常比除法更快。
用左闭右开区间。注意要处理好边界,不然会超时。
如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。
有如下两点:
- while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
- if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
- if (nums[middle] < target) left更新为middle+1,因为当前nums[middle]不等于target,然后去右区间找,所以left更新为middle+1,即:下一个查询区间也不会去比较nums[middle]
35.搜索插入位置
这个我最后是看[灵茶山艾府]看懂的,因为他有左闭右开的答案。
考虑这个插入的位置 pos,它成立的条件为:
nums[pos−1]<target<nums[pos]
其中 nums 代表排序数组。由于如果存在这个目标值,我们返回的索引也是 pos,因此我们可以将两个条件合并得出最后的目标:「在一个有序数组中找第一个大于 target 的下标」。
问题转化到这里,直接套用二分法即可,即不断用二分法逼近查找第一个大于 target 的下标 。
先把特判所有数都小于等于 target和所有数都大于 target的处理。
然后用二分查找,注意跳出while循环后,要返回right。
34. 在排序数组中查找元素的第一个和最后一个位置
看不懂
《代码随想录》数组:移除元素
四号标题
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
27. 移除元素
注意,指针不是链表,指针移动只需要加一。
还有注意,是原地修改。
注意,你只需要返回k就可以。
《代码随想录》数组:有序数组的平方
977. 有序数组的平方
这里用双指针,分别从两头遍历到中间。然后比较大小,移动指针。直到两个指针重合。
注意,
nums[l] ** 2
就是
nums[l] *nums[l]
还有int[] arr=new int[nums.length];
是new int [demension] 不能是new int [];