1.数组理论基础
数组理论基础 | 代码随想录 (programmercarl.com)
Java中数组的寻址由虚拟机完成,一维数组的内存空间是连续的,但是二维数组将一维数组作为引用类型,地址不是连续的
public static void main(String[] args) {
int[][] a = {{0, 1, 2}, {0, 1, 2}, {0, 1, 2}};
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
}
![](https://img.haomeiwen.com/i18575462/180d85cd73f7ac1f.png)
可以看到在二维数组中,行地址是被JVM加工过的
2.704.二分查找
二分查找难点在于区间定义,考虑两种区间定义法:左闭右闭[left, right],左闭右开[left, right)
![](https://img.haomeiwen.com/i18575462/78da7ee4a96d721e.png)
对于左闭右闭[left, right]来说,right指针是要被考虑的,所以应该是数组中的有效位,边界要减一
对于左闭右开[left, right)来说,right指针所☞的位置,应该是数组中的有效位的右边,边界不减一
另外while的条件有区别,分别是<=(左闭右闭) <(左闭右开)
3. 27.移除元素
暴力解法
class Solution {
public int removeElement(int[] nums, int val) {
int count = 0;
for (int i = 0; i < nums.length - count; i++) {
if (nums[i] == val) {
for (int j = i; j < nums.length - count - 1; j++){
nums[j] = nums[j+1];
}
count++;
i--; // 移位填充后,指针i保持原地
}
}
return nums.length - count;
}
}
要注意的是检测到需要删除的元素之后,还需要将指针i减一,使其留在原地,因为此时该位置上已经是新元素了,下轮循环中还需要考察该元素。
快慢指针法
//快慢指针
public int removeElement(int[] nums, int val) {
int fast = 0, slow = 0; // fast探路 slow指向有效位
int count = 0; // count记录删除了几个元素
while (fast < nums.length) {
if (nums[fast] == val) {
fast++; //如果探测到要删除的位,fast加一就可以略过该元素
count++; //删除元素个数加一
} else {
// 如果是有效位,直接把fast的值复制到slow位置上
// 判断slow 与 fast是否相等,可实现剪枝操作,避免无效的移位
if(slow != fast) nums[slow] = nums[fast];
slow++;
fast++;
}
}
return nums.length - count;
}
快慢指针法比较简单,只需要记住fast用于探路,slow用于记录当前有效位就行,后续使用场景较多,比如链表中判断环的位置。
网友评论