[刷题记录Day1]Leetcode列表专题

发布时间 2023-07-01 16:02:06作者: 喜欢毛绒绒的番茄子

No.1

题目

二分查找

思路

  • 要素:原数组升序排列
  • 清楚地定义左右边界
  • 优化空间:数组有序,通过第0元素和最后元素,可以避免查找不在数组范围内的target

代码

public static int search(int[] nums, int target) {  
    // 避免target小于nums[0],大于nums[nums.length-1]时参与运算  
    if (target < nums[0] || target > nums[nums.length - 1]) {  
        return -1;  
    }  
    // 使用左闭右闭区间写的 [left, right]    int left = 0, right = nums.length - 1;  
    while (left <= right) {  
        // 中间位置  
        int mid = left + (right - left) / 2; // 避免大数相加导致溢出  
        if (nums[mid] == target)  
            return mid;  
        else if (nums[mid] < target)  
            left = mid + 1;  
        else  
            right = mid - 1;  
    }  
    return -1;  
}

No.2

题目

移除元素

思路

  • 原地去除数组元素,直接用非val值覆盖即可
  • 双"指针":"指针"cur记录当前录入位置,"指针"p查找不等于val的数组值
  • 思路简单明了,但实现起来容易出错,最好用for循环控制fastIndex增加——fastIndex无条件增加,slowIndex只在满足if条件时增加

代码

public static int removeElement(int[] nums, int val) {  
    int slowIndex = 0;  
    for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {  
        if (nums[fastIndex] != val) {  
            nums[slowIndex] = nums[fastIndex];  
            slowIndex++;  
        }  
    }  
    return slowIndex;  
}