首页 > 编程语言 >代码随想录算法训练营第一天 | 704.二分查找 27.移除元素

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

时间:2024-05-08 19:55:24浏览次数:24  
标签:27 nums int 复杂度 随想录 mid slow low 移除

704.二分查找

题目链接:https://leetcode.cn/problems/binary-search/
文档讲解:https://programmercarl.com/0704.二分查找.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715

左闭右开

  • 时间复杂度 O(logn)
  • 空间复杂度 O(1)
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int low = 0, high = nums.size();
        while(low < high) {
            int mid = low + ((high - low) >> 1);
            if (nums[mid] == target) return mid;
            else if (nums[mid] < target) low = mid + 1;
            else high = mid;
        }
        return -1;
    }
};

左闭右闭

  • 时间复杂度 O(logn)
  • 空间复杂度 O(1)

第一遍写的时候循环条件写成while(low < high), 因为自己比较习惯写前闭后开的区间
这里要写while(low <= high) 因为low=high是有意义的,就像这样[1, 1]那么显然1在区间内
而如果是前闭后开的区间[1, 1),1不在区间内,所以while(low < high),这是很自然的嘛

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int low = 0, high = nums.size() - 1;
        while(low <= high) {
            int mid = low + ((high - low) >> 1);
            if (nums[mid] == target) return mid;
            else if (nums[mid] < target) low = mid + 1;
            else high = mid - 1;
        }
        return -1;
    }
};

27.移除元素

题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.移除元素.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP

暴力解法

  • 时间复杂度 O(n2)
  • 空间复杂度 O(1)

每次看到题目第一反应都是用暴力解,这道题的用暴力解很容易想到,唯一需要注意的就是,有连续的目标值出现时
一定要注意千万不要跳过了

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        for(int i = 0; i < nums.size(); ++i) {
            if (nums[i] == val) {
                for(int j = i; j < nums.size() - 1; ++j)
                    nums[j] = nums[j + 1];
                nums.pop_back();
                --i;  // 每次处理完重复元素后,新元素填充到了i的位置,但是下一次循环开始i的值加1,那么新添加到i位置的元素被跳过了,所以--i;
            }
        }
        return nums.size();
    }
};

双指针法

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

标签:27,nums,int,复杂度,随想录,mid,slow,low,移除
From: https://www.cnblogs.com/cscpp/p/18180749

相关文章

  • C++基础-如何引入第三方静态库、动态库或自定义库 摘自 https://blog.csdn.net/u01310
    C++无论是内置库还是第三方库,都需要自己手动进行查找、配置、引入等工作。本文即是帮助完成C++项目对于库、框架如何完成依赖引入达成可调用的目的,重点讲述开发工具VisualStudio中的操作静态库(.lib)静态库引入适用用于大部分无开源的第三方库,开发者不需要关心库的具体实现如何,......
  • 27.企业微信-L2
    importrequestsclassTestWework:deftest_get_token(self):self.corp_id="ww0500b1708efeb406"self.corp_secret="5fas7s3wQzC6k5W11SqZ1dxMcXvC57yKXi_NMVXu4pkBNY"self.base_url="https://qyapi.weixi11n.qq.......
  • Leetcode --- 203. 移除链表元素
    题目描述给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。示例1: 示例输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]输入:head=[7,7,7,7],val=7输出:[]参考实现方式1、使用递归实现......
  • 27-Spring源码分析(二)
    AOP源码分析1.AOP概述AOP(AspectOrientProgramming)利用代理模式,通过代理对象对被代理的对象增加功能。所以,关键在于AOP框架自动创建AOP代理对象,代理模式分为静态代理和动态代理。AspectJ使用静态代理,编译时增强,在编译期生成代理对象;SpringAOP使用动态代理,运行时......
  • P9527 [JOISC2022] 洒水器 题解
    题目传送门以下设\(\operatorname{dis}(x,y)\)表示树上\(x,y\)两点间的距离。修改时对\(u\)的周围与\(u\)距离小于等于\(d\)的点的点权乘\(w\)。暴力不行,于是考虑打标记。注意到\(0\led\le40\),一个很自然的想法是:设\(tag(x,i)\)表示将\(x\)的子树内与\(x\)......
  • 《代码随想录》-2.二分查找
    前提:1.有序2.无重复//版本1intleft=0;intright=nums.size()-1;while(left<=right){intmiddle=left+(right-left)/2;//防止溢出if(nums[middle]>target){right=milddle-1;}elseif(nums[middle]<target{left=middle+1;}else{returnmiddle;......
  • AP5127 是一款 PWM 工作模式,高效率、外围简单、内置功率管
    AP5121是一款外围电路简单的多功能平均电流型LED恒流驱动器,适用于宽电压范围的非隔离式大功率恒流LED驱动领域。芯片PWM端口支持超小占空比的PWM调光,可响应最小60ns脉宽。芯片采用我司专利算法,为客户提供最佳解决方案,最大限度地发挥灯具优势,以实现景观舞台灯高辉的调......
  • 《自动机理论、语言和计算导论》阅读笔记:p402-p427
    《自动机理论、语言和计算导论》学习第13天,p402-P427总结,总计26页。一、技术总结无。二、英语总结1.eludee--,assimilatedformofex-(out,away)+ludere(toplay,seeludicrous)。vt.ifsthyouwanteludesyou,youdonotsucceedinachievingit。p426,Mor......
  • 《代码随想录》-1.数组理论基础
    特点:1.内存空间-连续存放——>增删元素麻烦2.数据-相同类型3.下标从0开始注意:数组的元素采用覆盖的形式二维数组在内存的空间地址:1.C++中二维数组在地址空间上是连续的2.Java中二维数组每一行的头节点的地址是没有规则的......
  • c#数组移除同一个值
    数组移除数据,需要循环覆盖的方法。可以快慢双指针。循环一遍。publicintRemoveElement(int[]nums,intval){intn=nums.Length;intlow=0;for(inti=0;i<n;i++){if(nums[i]!=val){nums[low]=nums[......