代码随想录算法训练营第一天 | 数组理论基础 | LeetCode704.二分查找 | LeetCode27.移除元素
数组理论基础
说明:数组是存放在连续内存空间上的相同类型数据的集合.
注意:1.数组下标是从0开始 2.数组内存空间的地址是连续的.
问题:1.为什么不能直接删除数组中元素?----若是删除数组中元素,其余元素都要做移动操作,所以数组元素是不能删的,只能做覆盖操作.
2.那么思考二维数组在内存的空间地址是连续的么?----不同编程语言内存管理是不同的,比如c++二维数组是连续分布的,而Java是不连续的.
704.二分查找
题目: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
题目链接
分析加代码:
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;// 取个中间媒介
if (nums[mid] == target)
return mid;
else if (nums[mid] > target) {
right = mid - 1;// 中间值mid都大于目标值了,你只能缩小right了,说明偏大,需要减right
} else {
left = mid + 1; // 中间值mid都小于目标值了,你还不赶紧增加left值。说明偏右,需要加left
}
}
return -1;
}
}
补充与总结:1. Java里数组显示所有元素用 Arrays.toString(数组名) 该方法.
2. 理清数组个数与下标关系,比如个数是5,则下标最大是4.所以right要减一,因为一开始要把所有数囊括进去,目标可能出现在每一个位置.
3. int mid=left+( (right-left) / 2) 与 int mid=( left+right ) / 2 . 同答案,但是意义不同,比如值100是溢出,60(left)+50(right)=110>100,会发生溢出,但是前一个代码行不会出现溢出情况.
27.移除元素
题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
(不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。)
题目链接
分析加代码:
(双指针法)
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex=0;
for(int fastIndex=0;fastIndex<=nums.length-1;fastIndex++){
if(nums[fastIndex]!=val){
nums[slowIndex]=nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}//整体思路:定义两个快慢指针,不是我目标值的即要取,放入数组里(新数组的成立,其实就是覆盖旧数组,最后就是新的了),取一个++一下,最后算成新数组长度。
总结: 若无遇到目标元素(要删除的),快与慢指针工作流程是“快给慢收”。若遇到目标,不做更新操作,fast++向后移动一步,后移这一步的元素不为目标时,则把该值赋给停留在前一步的慢指针处,即把前面目标元素直接给覆盖了,即删除了.