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

文章介绍了使用二分查找解决704题,关注了防止整型溢出的问题;双指针法在27题中的应用,强调了指针移动和赋值的顺序;以及在剑指Offer21题中调整数组顺序使奇数位于偶数前面的策略,讨论了指针操作的细节。作者强调了多练习和思考在提升编程技能中的重要性。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

进入代码随想录的第一天,希望能够坚持下来,除了任务之外,每天刷两三道新题。之前是用IDEA刷的,有一些自动补全功能,现在直接在leetcode平台上刷题,提高对函数的熟练度。


提示:以下是本篇文章正文内容,下面案例可供参考

一、704. 二分查找

  • 二分法是针对于有序数组的
  • mid溢出问题
int mid = (left+right)/2;//?

如果left+right大于int型的上限,就会产生溢出问题
所以写成mid=left+(right-left)/2;或mid=left+(right-left)>>1;

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

用时6分钟

二、27. 移除元素

双指针法:通过两个指针在一个for循环中,完成两个for循环的作用
在for循环里的逻辑上卡了一些时间。判断,值如果不相等,那么他就是这个数组中的元素。
容易混的点:

  1. slow指针先移位后赋值还是先赋值后移位。
  2. 判断的是值相等还是值不相等。
    public int removeElement(int[] nums, int val) {
        //双指针
        int slow = 0;
        // int fast = 0;
        for(int fast=0;fast<nums.length;fast++){
            if(nums[fast]!=val){//?
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }

用时9分钟

三、剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

双指针法:慢指针指向更新 新数组下标的位置,快指针是找奇元素。
简单说,就是快指针找到了奇元素,就和慢指针的元素互换位置。

一些自己想的问题:
代码只是保证了奇数在偶数前面,但顺序不是原数组的顺序
比如:输入[1,2,3,4,6,7,8,10,11],输出:[1,3,7,11,6,2,8,10,4],6跑2前了。
会把奇数换到后面吗?不会
慢指针都是指向偶数才换的吗?对的,如果是奇数的话,快指针早就换了

有点想多了,其实只用考虑我把遇到的奇数都换到前面去,别的不用考虑。

    public int[] exchange(int[] nums) {
        int slow = 0;//存放元素 
        // int fast = 0;//找到奇数
        for(int fast=0;fast<nums.length;fast++){
            // System.out.println(fast);
            if (nums[fast]%2==1){
                int temp = nums[slow];
                nums[slow] = nums[fast];
                nums[fast] = temp;
                slow++;
            }
        }
        return nums;
	}

46分钟,和上面题很像,时间久了


总结

多加练习,勤于思考

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值