力扣刷题|704. 二分查找、27. 移除元素

LeetCode 704.二分查找

题目链接🔗:LeetCode 704.二分查找

思路

二分法涉及到挺多的边界问题,首先就是要定义好区间,区间的定义就是不变量

区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

  • 二分查找的前提条件

  1. 数组为有序数组

  1. 数组中没有重复元素

代码实现

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

对区间的定义不同主要会导致三处的变化:指针位置的定义、while的判断条件、指针更新的方式

下面来分析时间复杂度和空间复杂度

时间复杂度:时间复杂度就是算法执行语句的次数

假设一共有n个元素,每次查找的区间大小就是n, n/2, n/4, ..., n/2^k(其中k就是循环的次数)

最坏的情况就是还剩一个元素,n/2^k = 1 得k = log2n(以2为底的对数)

因此时间复杂度为O(log2n)

空间复杂度:空间复杂度就是算法所需的存储空间

因为变量只创建一次,所以空间复杂度为O(1)

LeetCode 27.移除元素

题目链接🔗:LeetCode 27.移除元素

思路

数组在内存空间的地址是连续的,删除其实就等于覆盖

主要有两种方法:

暴力解法:两层for循环,一是循环遍历数组元素,二是循环更新元素

双指针法:定义快慢指针,在一个for循环下完成遍历

  • 快指针:寻找新数组的元素,新数组就是不含有要删除的元素的数组

  • 慢指针:指向更新,新数组下标的位置

代码实现

暴力解法
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--;
            length--;
        }
    }
    return length;
 }

时间复杂度:O(n^2)

空间复杂度:O(1)

双指针法
 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、付费专栏及课程。

余额充值