代码随想录二刷第一天 | 704.二分查找、27.移除元素、977.有序数组的平方

52 阅读2分钟

704.二分查找

题目:704. 二分查找 - 力扣(LeetCode)

题解:代码随想录 (programmercarl.com)

状态:快速AC了

思路

关键条件:升序(二分的关键)、无重复元素(无重复索引)

注意:要分清边界条件,left<=right还是left<rightleft=mid+1,right=mid-1

代码

时间复杂度:O(log(n)) 空间复杂度:O(1)

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

27.移除元素

题目:27. 移除元素 - 力扣(LeetCode)

题解:代码随想录 (programmercarl.com)

状态:有一些细节问题需要注意——相向双指针,快慢指针

思路

注意:边界条件,需要在脑中思考一下两个指针的位置

代码

相向双指针

时间复杂度:O(n) 空间复杂度:O(1)

class Solution {
    public int removeElement(int[] nums, int val) {
        int left = 0;
        int right = nums.length - 1;
        
        while (left <= right) {
            // 注意这里的细节
            if (nums[left] == val) {
                nums[left] = nums[right];
                right--;
            } else {
                left++;
            }
        }
        
        return left;
    }
}

快慢指针

时间复杂度:O(n) 空间复杂度:O(1)

class Solution {
    public int removeElement(int[] nums, int val) {
        int fast = 0, low = 0;
        while(fast < nums.length){
            if(nums[fast] != val){
                nums[low] = nums[fast];
                low++;
            }
            fast++;
        }
        return low;
    }
}

977.有序数组的平方

题目:977. 有序数组的平方 - 力扣(LeetCode)

题解:代码随想录 (programmercarl.com)

状态:还是没想到关键点

思路

关键条件:数组两端一定是最大值,通过判断一定可以确认最大值

注意:双指针,新建一个结果数组

代码

时间复杂度:O(n) 空间复杂度:O(n)

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] res = new int[nums.length];
        int left = 0, right = nums.length - 1;
        int index = nums.length - 1;
        while(left <= right){
            if(nums[left] * nums[left] <= nums[right] * nums[right]){
                res[index--] = nums[right] * nums[right];
                right--;
            }else{
                res[index--] = nums[left] * nums[left];
                left++;
            }
        }
        return res;
    }
}