美文网首页代码思想录
代码随想录算法训练营第一天| 704. 二分查找、27. 移除元

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元

作者: zhk779 | 来源:发表于2023-12-11 22:49 被阅读0次

1.数组理论基础

数组理论基础 | 代码随想录 (programmercarl.com)

Java中数组的寻址由虚拟机完成,一维数组的内存空间是连续的,但是二维数组将一维数组作为引用类型,地址不是连续的

public static void main(String[] args) {
    int[][] a = {{0, 1, 2}, {0, 1, 2}, {0, 1, 2}};

    System.out.println(a[0]);
    System.out.println(a[1]);
    System.out.println(a[2]);
}
二维数组的列地址

可以看到在二维数组中,行地址是被JVM加工过的

2.704.二分查找

代码随想录 (programmercarl.com)

二分查找难点在于区间定义,考虑两种区间定义法:左闭右闭[left, right],左闭右开[left, right)


区间定义比较

对于左闭右闭[left, right]来说,right指针是要被考虑的,所以应该是数组中的有效位,边界要减一
对于左闭右开[left, right)来说,right指针所☞的位置,应该是数组中的有效位的右边,边界不减一
另外while的条件有区别,分别是<=(左闭右闭) <(左闭右开)

3. 27.移除元素

代码随想录 (programmercarl.com)

暴力解法

class Solution {
    public int removeElement(int[] nums, int val) {
        int count = 0;
        for (int i = 0; i < nums.length - count; i++) {
            if (nums[i] == val) {
                for (int j = i; j < nums.length - count - 1; j++){
                    nums[j] = nums[j+1];
                }
                count++;
                i--;  // 移位填充后,指针i保持原地
            }
        }
        
        return nums.length - count;
    }
}

要注意的是检测到需要删除的元素之后,还需要将指针i减一,使其留在原地,因为此时该位置上已经是新元素了,下轮循环中还需要考察该元素。

快慢指针法

//快慢指针
    public int removeElement(int[] nums, int val) {
        int fast = 0, slow = 0;  // fast探路 slow指向有效位
        int count = 0;  // count记录删除了几个元素
        while (fast < nums.length) {
            if (nums[fast] == val) {
                fast++; //如果探测到要删除的位,fast加一就可以略过该元素
                count++;    //删除元素个数加一
            } else {
                // 如果是有效位,直接把fast的值复制到slow位置上
                // 判断slow 与 fast是否相等,可实现剪枝操作,避免无效的移位
                if(slow != fast) nums[slow] = nums[fast]; 
                slow++;
                fast++;
            }
        }

        return nums.length - count;
    }

快慢指针法比较简单,只需要记住fast用于探路,slow用于记录当前有效位就行,后续使用场景较多,比如链表中判断环的位置。

相关文章

网友评论

    本文标题:代码随想录算法训练营第一天| 704. 二分查找、27. 移除元

    本文链接:https://www.haomeiwen.com/subject/vsgmgdtx.html