Day1:数组,二分查找leetcode704;移除元素leetcode27

一.数组

  • 数组是存放在连续内存空间上的相同类型数据的集合。下标从0开始,数组内存空间的地址是连续的。

二.二分查找(leetcode704)

  • 注意二分搜索的前提:有序不重复
  • 不用纠结数组是奇数还是偶数的问题,因为middle只是为了确定一个界而已。是否是中间的那个数并不重要,如果target比middle小,排除右边的数字即可,至于左右两边数字的数量是否相等,并不重要。参考
  • 区间的开闭确定时注意边界就好,注意考虑边界是否有意义是否能取到,其他正常理解就好,不用太拧巴

(可恶.我一开始只会暴力搜索了…并且还整了半天)

  • 暴力解法
class Solution {
    public int search(int[] nums, int target) {
        for(int i=0;i<nums.length;i++){
            if(nums[i]==target){
                return i;
            }
        }
        return -1;
    }
}
  • 二分:区间左闭右闭
class Solution {
    public int search(int[] nums, int target) {
        //左闭右闭
        int left=0;
        int right=nums.length-1;
        //int mid=left+(right-left)/2;注意mid是需要变换的
        while(left<=right){
            int mid=left+((right-left)/2);
            if(target<nums[mid]){//注意不是和mid比,是和数组中的中间元素比较
                right=mid-1;
            }
            else if(target>nums[mid]){
                left=mid+1;
            }
            else{
                return mid;
            }  
    }
    return -1;
}
}

-二分:区间左闭右开

class Solution {
    public int search(int[] nums, int target) {
        //左闭右开
        int left=0;
        int right=nums.length;//左闭右开的时候,右边取不到
        //int mid=left+(right-left)/2;注意mid是需要变换的
        while(left<right){
            int mid=left+((right-left)/2);
            if(target<nums[mid]){//注意不是和mid比,是和数组中的中间元素比较
                right=mid;
            }
            else if(target>nums[mid]){
                left=mid+1;
            }
            else{
                return mid;
            }  
    }
    return -1;
}
}

三.删除元素(暴力解法,快慢指针)

  • 暴力解题法
    (leetcode上,java好像过不了??会超时,不过应该算法本身没啥问题)
class Solution {
    public int removeElement(int[] nums, int val) {
        int len=nums.length;
        for(int i=0;i<nums.length;i++){
            if(nums[i]==val){
                for(int j=i+1;j<nums.length;j++){
                    nums[j-1]=nums[j];
                }
                i-=1;//注意因为往前面移了一位,因此i需要-1
                len-=1;
            }
        }
        return len;
    }
}

利用一个循环,来完成两个循环会完成的任务,不会改变元素的相对位置。
个人理解的主要思路:
快指针:遍历原始数组中的所有元素
慢指针:记录新数组的下标

当快指针遍历原始数组时,如果其所指向的元素与需要移除的元素不相等,那么将该元素“传递”慢指;当遍历元素与慢指针相同时,跳过即可。

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

ps
1.大四好无聊…好无聊。我要找点事情做!然后跟着巨佬一起刷题。我觉得我可以的!!
2.day0怎么有巨佬大一就开始卷了啊…他们还会自己搭博客。好酷啊!!我也要
3.day1数组有啥考的啊…好的我错了。现在只会暴力搜索了(好吧…我以前的算法也很烂)!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值