【代码随想录算法训练营第一天 | 数组理论基础 | LeetCode704.二分查找 | LeetCode27.移除元素】


代码随想录算法训练营第一天 | 数组理论基础 | 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++向后移动一步,后移这一步的元素不为目标时,则把该值赋给停留在前一步的慢指针处,即把前面目标元素直接给覆盖了,即删除了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值