代码随想录算法集训营第一天(补卡)
学习目标:
数组理论基础
二分查找
学习内容:
数组理论基础
C++与Java二维数组的地址空间区别
C++中二维数组在地址空间上是连续的。
Java元素地址不会暴露给程序员,寻址操作完全交给虚拟机。
Java二维数组的底层地址在内层数组之间是不连续的,但在每个内层数组内部是连续的。
二分查找
704. 二分查找
二分查找最重要的是要遵循循环不变性,什么意思呢?
就是对于区间的定义在循环中要保持一致
闭区间写法
初始化:闭区间左右端点的值都是可以取到的,因此初始化要为[能取到的最小值, 能取到的最大值]
int left = 0, right = nums.length - 1;
循环条件
while (left <= right)
更新区间范围
left = mid + 1;
right = mid - 1;
全部代码
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if (nums[mid] == target){
return mid;
}else if (nums[mid] < target){
left = mid + 1;
}else {
right = mid - 1;
}
}
return -1;
}
左闭右开区间写法
初始化:该写法右端点无法取到,因此初始化要为[能取到的最小值, 能取到的最大值 + 1]
int left = 0, right = nums.length;
循环条件
while (left < right)
更新区间范围
left = mid + 1;
right = mid;
全部代码
public int search(int[] nums, int target) {
int left = 0, right = nums.length;
while(left < right){
int mid = left + (right - left) / 2;
if (nums[mid] == target){
return mid;
}else if (nums[mid] < target){
left = mid + 1;
}else {
right = mid;
}
}
return -1;
}
27. 移除元素
暴力解法
先尝试用暴力法求解
由于是数组,元素不能直接删除,只能通过覆盖的方式
public int removeElement(int[] nums, int val) {
int size = nums.length;
for (int i = 0; i < size; i++){
if (nums[i] == val){
// 将后续元素前移
for (int j = i + 1; j < size; j++) {
nums[j - 1] = nums[j];
}
size--;
// 数组元素整体前移后,还需要判断当前的元素
i--;
}
}
return size;
}
快慢指针
定义两个指针slow和fast用于遍历
其中slow表示最终结果数组的索引,fast用于找到新的元素
public int removeElement(int[] nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] != val){
nums[slow++] = nums[fast];
}
}
return slow;
}
977.有序数组的平方
思路
由于数组是有序的,用双指针从两端向中间比较平方
public int[] sortedSquares(int[] nums) {
int len = nums.length;
int index = len - 1;
int left = 0, right = len - 1;
int[] res = new int[len];
while(left <= right){
if (square(nums[left]) >= square(nums[right])){
res[index] = square(nums[left]);
index--;
left++;
}else {
res[index] = square(nums[right]);
right--;
index--;
}
}
return res;
}
public int square(int i){
return i * i;
}
刷题心得
- 要学会debug程序,可以通过IDE