算法训练营第一天| 数组理论基础 ;704 二分查找; 27. 移除元素;977.有序数组的平方
数组
数组是存放在连续内存空间上的相同类型数据的集合。
数组的元素是不能删的,只能覆盖。
二分查找 : 704
有序数组和不重复是二分查找的前提
防止溢出: int mid = left + (right - left)/2;
二种写法:左闭右闭 [left, right] :while (left <= right) {left = mid - 1; right = mid + 1}
相关题:34:在排序数组中查找元素的第一个和最后一个位置
ArrayList<Integer> nums = new ArrayList<>();
nums.add();
nums.remove();
双指针:27. 移除元素 力扣题目链接
快慢指针!
要做完相关题!
双指针的变形题就不会了:
977.有序数组的平方:
开始的思路:
找到zeroIndex表示第一个非负数的Index,然后从这为界,分成slow,fast指针。
然后 双指针向相反的方向移动:也就变成了 两个升序数组的合并为一个升序数组:但一直卡在如何交换位置。
看完代码随想录的感受:
- 暴力排序(int[].sort()) 时间复杂度是O(n+logn)? 需要了解 背后的原码是怎么实现! 哪种排序方法!
- 为何 双指针可以从左到右,也可以从两边同时向里滑动!也可以不是快慢指针,取决于条件 然后 左右指针移动!要利用好这个数组的特性(从zeroIndex开始两个方向上都是升序数组)两边是最大!先比两遍,然后移动。
- 可以新建一个数组,然后存数据,比完就往里面放。
整理后的结果: