数组基础知识整理
数组是存放在连续内存空间上的相同类型数据的集合。
数组可以方便的通过下标索引的方式获取到下标下对应的数据。
需要两点注意的是
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
数组的元素是不能删的,只能覆盖。
那么二维数组在内存的空间地址是连续的么?
C++中二维数组在地址空间上是连续的。
Java中的二维数组在地址空间上是不连续的。
--> 例子:
将main方法加载到栈内存中,执行int [ ][ ] arr = ,此时虽然采用静态初始化方法无new,依旧在堆内存中开辟一块空间,创建一个数组(3个连续的空间),数组的索引为0-2。针对此时的索引进行输出时得到的会是一个一维数组的地址值(即二维数组中“行”存放“列”的地址值)。此时创建3个一维数组,每个一维数组对应的索引为0-1。在这时的一维数组分别保存1-2,3-4,5-6。三个一维数组分别有三个内存地址值,此时二维数组存放的就是这3个内存地址值。
在二维数组通过3个地址值就可以找到3块空间,此时二维数组才算创建完毕,也会有一个对应的地址值(图上的0x0011),并把这个地址值赋值给arr。
参考资料:
https://www.jianshu.com/p/2eea7f9033c9
704 二分搜索
思路参考:代码随想录
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while(left <=right){
int middle = left + (right-left)/2;
if(target == nums[middle]){
return middle;
}else if(target > nums[middle]){
left = middle+1;
}else if(target < nums[middle]){
right = middle -1;
}
}
return -1;
}
}
27 移除数组
思路参考:代码随想录
注意:时间复杂度为O(1),且最后输出的并不是所有的数组
方法:快慢指针 -
如果快指针遇到的数不等于val;那么将快指针的那个数替换给慢指针所在的位置;慢指针向后移一位(刚开始的时候,快慢指针在相同位置也是需要原位替换的)
运用原理:数组的地址块是连续的,删除只能覆盖;删除一个之后,后面的位置全部都需要往前移动
class Solution {
public int removeElement(int[] nums, int val) {
int fast = 0;
int slow = 0;
while(fast < nums.length){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
}