第一天| 704. 二分查找,27. 移除元素

# 题目考察点:二分法

## 704_题目链接:https://leetcode.cn/problems/binary-search/

### 代码实现

package LeetCode;

public class YangSibo_704 {
    public static void main (String args []) {
        int [] nums = {-1,0,3,5,9,12};
        int target = 9;
        YangSibo_704_1 demo1 = new YangSibo_704_1();
        YangSibo_704_2 demo2 = new YangSibo_704_2();
        System.out.println("demo1:" + demo1.search(nums,target));
        System.out.println("demo2:" + demo2.search(nums,target));
    }
}

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

### 解题注意事项
1、左闭右开与左闭有闭的比较范围
左闭右开  [left,right)  范围是[0,nums.length)   while(left < right)
左闭右闭  [left,right]  范围是[0,nums.length-1]   while(left <= right)

2、middle取值一定要确定middle是否满足在新半区的比较范围内
左闭右开时
当middle的值 > target target在middle的左边 更新左半区 right = middle 
当middle的值 < target target在middle的左边 更新右半区 left = middle +1 
左闭右闭时
当middle的值 > target target在middle的左边 更新左半区 right = middle -1 
当middle的值 < target target在middle的左边 更新右半区 left = middle +1 

3、704_1写的是左闭右开 704_2写的是左闭右开

# 题目考察点:双指针

## 27_题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

### 代码实现

package LeetCode;

public class YangSibo_27 {
    public static void main (String args []) {
        int [] nums = {0,1,2,2,3,0,4,2};
        int val = 2;
        YangSibo_27_1 demo1 = new YangSibo_27_1();
        YangSibo_27_2 demo2 = new YangSibo_27_2();
        System.out.println("demo1:" + demo1.removeElement(nums,val));
        System.out.println("demo2:" + demo2.removeElement(nums,val));
    }
}


class YangSibo_27_1 {
    public int removeElement(int[] nums, int val) {
        int length = nums.length;
        if (length == 0 ) {
            return  0;
        }
        for (int i = 0; i < length; i++) {
            if (nums[i] == val) {
                for (int j = i + 1; j < length; j ++) {
                    nums [j-1] = nums [j];
                }
                i--;
                length--;
            }
        }
        return length;
    }
}

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

### 解题注意事项
1、基本概念
暴力破解也可行,注意不要越界
删除数组的某一个数据,真实的操作是覆盖,数组是一块连续的地址

2、快慢指针的区分
fast快指针需要找到不属于新数组的数据
slow慢指针是需要将属于新数组的数据下标记录下来,并记录新数组的数量
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值