代码随想录算法训练营Day1|Leetcode704二分查找、27移除元素

Day1打卡! 时长:2.5h

今日感想:这是我第一次真正意义上的刷算法,并且认认真真的记录博客。由于是第一天,还是有很大的新鲜感的,不管是思考解题还是撰写博客,都在不断尝试。希望在卡哥的带领下和各位录友们的陪伴下能够坚持下去💪!

数组理论基础

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

可通过下标索引方式获取相应数据,下标从0开始

数组内存空间的地址连续

数组的元素不能删除,只能覆盖。

对于二维数组,在C++中地址空间上是连续的,在Java中不是连续的。

Leetcode704 二分查找

题目链接:Leetcode704 二分查找

第一想法:首先根据题目应该有一个整型数组nums和一个目标值target变量,其次还要设置当前数组下标的最小值min=0和最大值max=size-1。由于数组是升序的,每次取下标值middle=(min+max)/2下标的值同target作比较,如果数组值大了,就修改max=middle-1。反之,数组值小了,就修改min=middle+1,循环比较,若相等,返回middle值。

讲解后想法:重点是要根据数组左闭右闭还是左闭右开来抉择循环不变量的取值,我都没考虑边界问题,不细节。

左闭右闭 [ ] 时,while(min<=max),middle大则修改max=middle-1,小则修改min=middle+1。

左闭右开 [ ) 时,max=size,while(min<max),middle大则修改max=middle,小则修改min=middle+1。

遇到的困难:哈,第一题就被难住了,提键盘忘代码。发现自己真的到应用的时候,竟然不知从何下笔。也有可能是因为当初学数据结构的时候用的是C语言,而现在在用Java。

代码:左闭右闭版本

class Solution {
    public int search(int[] nums, int target) {
        int min = 0;
        int max = nums.length - 1;

        if(target < nums[min] || target > nums[max]){
            return -1;
        }

        while(min <= max){
            int mid = min + ((max - min) >> 1);
            //右移m>>n 代表把数字m除以2的n次方。若为单数,则是将m除以2的n次方的整数商。
            if(nums[mid] == target)
                return mid;
            else if(nums[mid] < target)
                min = mid + 1;
            else if(nums[mid] > target)
                max = mid - 1;
        }
        return -1;
    }
}

Leetcode27 移除元素

题目链接:Leetcode27 移除元素

第一想法:刚拿到这道题有点懵,突然没有思路。感觉应该是从0下标到数组长度逐个对比删除,但是每次又要涉及后面的元素往前移动。看了看示例,发现应该删除的位置补零也可以,我猜测可以遍历的时候先将相应位置补零,这样不涉及移位的问题,然后再把不是零的元素往前挪。

讲解后想法:害,当初学的指针现在都忘到脑后头去了。看了讲解终于拾回点记忆。并且领悟了快慢指针的方法发现是真的巧妙!

遇到的困难:数组以及指针这方面知识有点忘了,回去着重复习一下。

代码:快慢指针版

class Solution {
    public int removeElement(int[] nums, int val) {
        //快慢指针法
        int slow = 0;
        for(int fast = 0; fast < nums.length; fast++){
            if(nums[fast] != val){
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值