代码随想录算法营 | Day01| 704. 二分查找,27. 移除元素 | 第一篇博客,慢慢养成好习惯!

#数组理论

(内容参考代码随想录)

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

数组可以方便的通过下标索引的方式获取到下标对应的数据。

eg:字符数组

注意点:

  • 数组的元素是不能删的,只能覆盖。
  • 数组下标都是从0开始的。
  • 数组内存空间的地址是连续的

eg:二维数组

#算法题目

LeetCode 704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

二分法第一种情况:

定义 target 是在一个在左闭右闭的区间里,也就是[left, right] 

例如在数组:1,2,3,4,7,9,10中查找元素2

eg:

Code:

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

二分法第二种情况:

定义 target 是在一个在左闭右开的区间里,也就是[left, right) 

例如在数组:1,2,3,4,7,9,10中查找元素2

eg:

Code:

class Solution {
    public int search(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        if (target < nums[left] || target > nums[right]){
            return -1;
        }
        while (left < right){
            int mid=left+((right-left)>>1);
            if(nums[mid]==target)
            return mid;
            else if (nums[mid]>target)
            right = mid;   // 主要区别,左闭右闭为right = mid -1
            else if (nums[mid]<target)
            left = mid+1;
        }
        return -1;
    }
}
  • 时间复杂度:O(log n)
  • 空间复杂度:O(1)
LeetCode 27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

暴力解法:

class Solution {
    public int removeElement(int[] nums, int val) {
        int length = nums.length;
        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--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
                length--; // 此时数组的大小-1
            }
        }
        return length;
    }
}
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

双指针法:

1.快慢指针法: 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作

定义快慢指针

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置

eg:

Code:

class Solution {
    public int removeElement(int[] nums, int val) {
        int slowIndex=0;
        for ( int fastIndex=0; fastIndex < nums.length; fastIndex++){
            if (nums[fastIndex] != val){
                nums[slowIndex]=nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

开营第一天!继续消化相向双指针法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值