目录
数组理论基础
文章讲解:代码随想录
数组是存放在连续内存空间上的相同类型数据的集合。
数组可以方便的通过下标索引的方式获取到下标对应的数据。
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的。
因为数组在内存空间的地址是连续的,所以在删除或者增添元素的时候,要移动其他元素的地址。
数组的元素不能删除,只能覆盖。
在C++中二维数组在地址空间上是连续的,Java中不连续。
704.二分查找
左闭右闭
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + ((right - left)>>1);
if(nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target){
left = mid + 1;
}else {
return mid;
}
}
return -1;
}
}
左闭右开
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left < right){
int mid = left + ((right - left)>>1);
if(nums[mid] > target) {
right = mid;
} else if (nums[mid] < target){
left = mid + 1;
}else {
return mid;
}
}
return -1;
}
}
左闭右闭:while(left<=right),mid > target: right=middle-1,mid < target: left=middle+1
左闭右开:while(left<right),mid > target: right=middle,mid < target: left=middle+1
mid=(left+right)>>1的含义
右移运算符>>,运算结果正好能对应一个整数的二分之一值,这就正好能代替数学上的除2运算,但是比除2运算要快。
mid=(left+right)>>1相当于mid=(left+right)/2
27. 移除元素
暴力破解
数组是连续的,当其中一个数字需要移除的时候,要把完整的数组从移除的这一位全部向前移动。
class Solution {
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];
}
i--;
size--;
}
}
return size;
}
}
双指针法(快慢指针法)
class Solution {
public int removeElement(int[] nums, int val) {
int fastIndex = 0;
int slowIndex;
for(slowIndex = 0; fastIndex < nums.length; fastIndex++) {
if(nums[fastIndex] != val){
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}
通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置