【leetcode学习记录】

1.二分法

今天刷题的时候发现二分法在有重复数字的有序数组中也可以使用,只需要将基本的二分法稍作改动即可。

//leetcode-704
//这是基本的二分法寻找目标元素
class Solution {
    public int search(int[] nums, int target) {
        if(nums[0] > target || nums[nums.length - 1] < target){
            return -1;
        }
        int left = 0, right = nums.length - 1;
        while(right >= left){
            int middle = (left + right) / 2;
            if(nums[middle] == target){
                return middle;
            }
            else if(nums[middle] > target){
                right = middle - 1;
            }
            else{
                left = middle + 1;
            }
        }
        return -1;
    }
}

如果要找target的右边界,就是当nums[middle] == target的时候,也要更新left,同理,寻找左边界,就要在nums[middle] == target的时候更新right。
eg:123333456(比如目标数字为3,最左边的3就是左边界,最后边的3就是右边界)

2.双指针法(快慢指针法)

个人理解:定义两个指针,慢指针一直指向即将被替换元素,快指针一直寻找替换元素。慢指针左侧都是处理好的序列,快指针右侧都是待处理的序列。(基本的思想:快慢指针同时移动,当同时指向不需要存到序列中的元素时,快指针单独移动,直至指向需要存入序列的元素,之后将快指针指向的元素存入慢指针指向的序列位置,之后继续同时移动,以此类推)

//leetcode-283
//将数组中的0全部移动到最后
class Solution {
	public void moveZeroes(int[] nums)  {
        int slow;
        int fast = 0;
        for(slow = 0; fast < nums.length; fast++){
            if(nums[fast] != 0){
                nums[slow++] = nums[fast];
            }
        }
        for(int i = slow; i < nums.length; i++){
            nums[i] = 0;
        }
    }
 }

未完待续。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值