代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、35. 搜索插入位置

leetcode 704 二分查找

题目链接

704. 二分查找 - 力扣-LeetCode

做题过程

拿到题目首先先思考二分查找是什么。 二分查找首先需要定义寻找区间(left和right),同时,也想到了定义mid作为判断值与target进行对比。但最开始时候忘记了如何定义循环条件, 在查看了思路后,想起用while (left <= right)作为判断条件 。之后根据自己了思路完成了代码。在代码运行时,虽然结果正确,但是一直提示超时对照思路发现mid应为mid +1or mid-1

解决方法

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

leetcode 27 移除元素

题目链接

27. 移除元素 - 力扣-LeetCode

做题感想

这道题主要是根据双指针的思想。设置快慢两个指针,然后把快指针的值符给慢指针来更新数组。最后返回慢指针的值即为新的数组长度。

解决方法

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

leetcode 35 搜索插入位置

题目链接

35. 搜索插入位置 - 力扣-LeetCode

做题感想

这道题根据题目中的升序排列及无重复元素,想到了利用二分法解决。但对于返回值,我认为如果没找到到这个值,left与right相当,此时left插入就好。但实际上应该插入right右边的值。修正后通过测试。

解决方法

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

总结

  1. 对于二分查找,注意左闭右开(left

  2. 双指针法的思路要明白,利用快慢指针来进行。

你可能感兴趣的:(leetcode,算法,java)