[代码随想录] 第一天

发布时间 2024-01-10 16:27:52作者: 糟糕的家伙

704.二分查找 [https://leetcode.cn/problems/binary-search/description/]
思路: 二分查找适用于在有序数组中查找目标值,左边边界为left,右边边界为right,每次使用middle=(right+left)/2,将原数组划分为[left,middle]和[middle,right]两个数组,若middle <target,则目标值落在右边数组,否则落在左边数组,直到right<left时,退出循环,结束划分。若nums[middle]==target,返回middle,否则返回-1,数组无target值。

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        int middle = 0;
        while(left<=right){
            middle = (left+right)/2;
            if(nums[middle] == target){
                return middle;
            }else if(nums[middle]>target){
                right = middle -1 ;
            }else
                left = middle +1 ;
        }
        if(nums[middle] == target){
        	return middle;}
        return -1;
    }
}

--------------------------------------------------------------------------------------------------------
27.移除元素[https://leetcode.cn/problems/remove-element/]
思路: 数组在内存中申请一段连续的内存地址,所以不能删除元素,只能覆盖元素
本能想到暴力解,是用第一层循环使用i寻找与target相等的元素,第二层用于从i开始,使用j将后续所有元素向前挪动一位。
时间复杂度:O(n^2)

class Solution {
    public int removeElement(int[] nums, int val) {
        int length = nums.length;
        for(int i = 0;i<length;i++){
            if(nums[i] == val){
                 length--;
                for(int j =i;j<length;j++){
                    nums[j]=nums[j+1]; 
                }
                i--;
            }
        }
        return length;
    }
}

进阶思路:使用快慢指针,快指针quick用于向前判定元素值,慢指针slow用于停留在第一个要移除target值,length用于保存数组长度,双指针默认自增,若quick指向target值,length自减,slow--以抵消自增,保持静止,若quick指向非target值(此时quick指向第一个非target值),使用此值覆盖原slow值,继续循环。
时间复杂度:O(n)

class Solution {
    public int removeElement(int[] nums, int val) {
        int length = nums.length;
        int quick = 0;
        int slow = 0;
        for (; quick < nums.length; slow++, quick++) {
            if (nums[quick] == val) {
                slow--;
                length--;
            } else {
                nums[slow] = nums[quick];
            }
        }
        return length;
    }
}

这是我的第一篇博客,也是算法的第一篇打卡,希望自己能够努力坚持下去吗?