代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

数组理论基础 

文章链接:代码随想录

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

数组下标都是从0开始的

因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址

数组的元素是不能删的,只能覆盖


704.二分查找

难度:简单

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录

思路:

使用二分法的前提条件:数组为有序数组数组中无重复元素

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

怕绕晕了所以这里解题只用第一种定义, target 在[left, right]

C++代码

//时间复杂度:O(log n)
//空间复杂度:O(1)
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1; 
        while (left <= right) { 
            int middle = (right + left) / 2;
            if (nums[middle] > target) {
                right = middle - 1; 
            } else if (nums[middle] < target) {
                left = middle + 1 ; 
            } else { 
                return middle; 
            }
        }

        return -1;
    }
};

Python代码

#时间复杂度:O(log n)
#空间复杂度:O(1)
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1 

        while left <= right:
            middle = (right + left) // 2
            
            if nums[middle] > target:
                right = middle - 1  
            elif nums[middle] < target:
                left = middle + 1  
            else:
                return middle  
        return -1  

27.移除元素

难度:简单

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录

 1.暴力解法

思路:数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖,两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组

C++代码

// 时间复杂度:O(n^2)
// 空间复杂度:O(1)
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size = nums.size();
        for (int i = 0; i < size; i++) {
            if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
                for (int j = i + 1; j < size; j++) {
                    nums[j - 1] = nums[j];
                }
                i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
                size--; // 此时数组的大小-1
            }
        }
        return size;

    }
};

Python代码

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i, l = 0, len(nums)
        while i < l:
            if nums[i] == val: # 找到等于目标值的节点
                for j in range(i+1, l): # 移除该元素,并将后面元素向前平移
                    nums[j - 1] = nums[j]
                l -= 1
                i -= 1
            i += 1
        return l

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

思路:快指针先走,走到符合条件的元素时告诉慢指针记录一下。

C++代码

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

Python代码

# 快慢指针法
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
    
        fast = 0  
        slow = 0  
        size = len(nums)
        while fast < size: 
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值