数组理论基础
数组在内存中的存储形式——>数组是存放在连续内存空间中相同类型数据的集合
内存空间是连续的意味着删除某个元素,会需要移动其他元素的地址。
二维数组在C++语言下的存储是连续的,而在Java中则非连续
704、二分查找
二分查找的关键——>理解区间的定义(不变量),循环不变量规则
常见的二分查找区间分为:左闭右闭 ' [ ] ' 、左闭右开 ' [ ) '
个人初步碰到这道题,只知道暴力遍历
//暴力遍历查找
for (int i = 0; i < nums.length; i++) {
if (nums[i] == target) {
return i;
}
}
return -1;
左闭右闭题解
public int search(int[] nums, int target) {
/*二分查找(左闭右闭'[]')*/
int left = 0;
int right = nums.length -1;//保证right闭合
while (left <= right) {
int middle = (left + right) / 2;//取中位数
if (nums[middle] > target) {//target在左区间内
right = middle - 1;//middle值不需要再比对,区间变更为[left,middle-1]
} else if (nums[middle] < target) {//target在右区间内
left = middle + 1;//区间变更为[middle+1,right]
} else {//hit the target
return middle;
}
}
//没有找到值
return -1;
}
个人在看了一遍解题思路之后,手撸代码,发现个人的一个疑问点:
if语句中,为什么是middle - 1 或者 middle + 1 ;
个人思考理解有以下几步关键点,
①if判断确认了target的所在区间——>
②排除了middle所在位置的元素——>
③middle - 1 作为新的右区间端点 / middle + 1作为新的左区间端点
27、移除元素
双指针解法:
模拟的是C++语言中的erase函数,时间复杂度为O(n)。
核心要点是两个指针代表的含义
fast——>快指针是寻找新数组里所需要的元素
slow——>新数组的下标值