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

704. 二分查找

题目链接

704. 二分法查找

难度

看到题目的第一想法

使用线性查找方法

看完代码随想录之后总结

解题思路:

1. 涉及基础知识

        1)数组是存放在连续内存空间上的相同类型数据的集合

        2)数组下标都是从0开始的。数组内存空间的地址是连续的

        3)二维数组,python在内存的空间地址是连续的,java在内存的空间地址是不连续的

        4)数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

2.二分法查找前提条件

        1)有序性:数组必须是事先排序好的。如果数组无序,那么久无法判断目标值是在左侧还        是右侧,也就无法进行有效的折半操作了。

        2)重复元素处理:如果数组中右重复元素,二分法查找可以找到其中一个匹配项,但通常不会指定是哪一个。如果需要找到所有匹配或者找到第一个或最后一个匹配项,则需要进行额外的逻辑。

        3)效率问题:小规模数据集,二分不一定比线性查找快,因为二分涉及更多的比较和索引计算。但是数据集非常大时,二分的时间复杂度是O(log n)会明显优于线性查找O(n)。

3.解题思路

        1)注意:区间的定义,明确left<=right(左闭右闭)或是left<right(左闭右开)时left以及right变更时的取值;时间复杂度:O(log n),空间复杂度:O(1)

#

        2)文章讲解:代码随想录-数组-二分法查找

        3)视频讲解:代码随想录-二分法查找-视频讲解

代码实现

python

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # 左闭右闭
        left = 0
        right = len(nums) - 1
        while(left<=right):
            mid = (left + right) // 2
            if nums[mid] > target:
                right = mid - 1
            elif nums[mid] < target:
                left = mid + 1
            else:
                return mid
        return -1
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # 左闭右开
        left = 0
        right = len(nums)
        while( left < right):
            mid = (left + right) // 2
            if nums[mid] > target:
                right = mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                return mid
        return -1

java  

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

27. 移除元素

题目链接

力扣27.移除元素

难度

简单

看到题目的第一想法

暴力解法

看完代码随想录之后的总结

1.涉及的基础知识

        主要注意数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

2.解题思路

        主要考察的是双指针的解法(快慢指针),时间复杂度:O(n),空间复杂度:O(1)。

3.代码实现

        python

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        slow, fast = 0, 0
        n = len(nums)
        while(fast < n):
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

        java

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

今日收获

        原来有刷过题目,不过只用了python,这次刷题主要是想把java一起练了(初学阶段),虽然刷过但是在写二分法查找的时候对边界的处理还是理解的不到位,看了视频讲解豁然开朗,相信理解以后再做相应题目的时候就会更加熟悉了。对于快慢指针相对较熟悉了,主要是练习了一下java的语法。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值