Day1 数组part01


今日任务:数组理论基础,704. 二分查找,27. 移除元素


Part1: 数组理论基础

文章链接:https://programmercarl.com/数组理论基础.html

重点:

  1. 数组下标都是从0开始的。
  2. 数组内存空间的地址是连续的(在c++中一维数组和二维数组的地址都是连续的)。


Problem: 704. 二分查找

思路

二分法的本质其实就是找两段性质,然后不断更新这两个性质的区间。所以针对二分的的问题我们可以有如下的思路:

解题方法

这里给出一种通用的二分模板解法:

需要特别注意的是,这个代码不适用两个特殊情况,一种就是目标值不在数组中并且比所有值小,一种是目标值步骤数组中并且比所有值大,这两种情况会导致l和r没有更新,因此在输出结果时要检查l,r是否是-1和n(也就是原值),这个在之后的代码叙述。

链接: 1.https://www.bilibili.com/video/BV1d54y1q7k7/?spm_id_from=333.999.0.0&vd_source=90560ea8f1a9d426bcf084887a3f5d66 2.https://blog.csdn.net/WJPnb1/article/details/126360962?spm=1001.2014.3001.5502

复杂度

  • 时间复杂度:

时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。

假设总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2k,其中k就是循环的次数,n/2k >= 1(1最坏的情况,即还剩一个元素),令n/2^k=1,可得k=log2n(以2为底,n的对数),所以时间复杂度可以表示O(log2n)。

  • 空间复杂度:

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。

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

Code


class Solution {
public:
int search(vector<int>& nums, int target) {
int l = -1;
int r =nums.size();
while(l + 1 != r){
int mid = (l+r)/2;
//以小于等于目标为分界线,搜索第一个不大于目标值的值(代表着有可能是这个值也可能不是)。
if(nums[mid] <= target) l = mid;
else r = mid;
} //先过滤掉l为-1的特殊情况,再带入数组下标避免数组越界错误。
if(l == -1 || nums[l] == target){
return l;
} else{
return -1;
}
}
};

Problem: 27. 移除元素

思路

  1. 首先我们可以用暴力解法,用两个循环遍历整个数组,外层循环找数,每找到一个和目标值相等的数,内层循环就向前移动一位,注意最后要 i--,防止指针越过这一位。

2.我们可以运用快慢指针,慢指针先一个一个移动,目的是保留当前下标,快指针快速移动到非目标值(需要一个判断),并且将非目标值赋值到慢指针处。最后慢指针的下标就是所求数组长度。本题之所以可以用快慢指针,就是因为快指针可以一遍遍历不用回头。

解题方法

快慢双指针算法

简单Code

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

暴力Code

class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
//数组判空,养成好习惯
if(len == 0){
return 0;
}
int rlen = len;
for(int i = 0; i<len; i++){
if(nums[i] == val){
for(int j = i+1; j<len; j++){
nums[j-1] = nums[j];
}
i--;
rlen--;
}
}
return rlen;
}
};

算法打卡|Day1 数组part01的更多相关文章

  1. LeetCode初级算法的Python实现--数组

    LeetCode初级算法的Python实现--数组 # -*- coding: utf-8 -*- """ @Created on 2018/6/3 17:06 @aut ...

  2. 算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  3. 前端与算法 leetcode 189. 旋转数组

    目录 # 前端与算法 leetcode 189. 旋转数组 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 189. 旋转数组 题目描述 189. 旋转数组 概要 把他当做一到简单 ...

  4. 坐标轴刻度取值算法-基于魔数数组-源于echarts的y轴刻度计算需求

    本文链接:https://blog.csdn.net/qq_26909801/article/details/96966372数值型坐标轴刻度计算算法前言算法描述上代码代码运行效果结语前言因实习的公司 ...

  5. KMP 算法中的 next 数组

    KMP 算法中对 next 数组的理解 next 数组的意义 此处 next[j] = k:则有 k 前面的浅蓝色区域和 j 前面的浅蓝色区域相同: next[j] 表示当位置 j 的字符串与主串不匹 ...

  6. c语言经典算法——查找一个整数数组中第二大数

    题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...

  7. 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

    之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...

  8. KMP算法 --- 深入理解next数组

    在KMP算法中有个数组,叫做前缀数组,也有的叫next数组. 每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符. 当然它描述的也是子串的对称程度,程度越高,值 ...

  9. 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆

    原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...

  10. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

随机推荐

  1. 基于Elasticsearch 为电商提供商品数据大数据查询

    基于Elasticsearch 为电商提供商品数据大数据查询 前言 对于现代电商的产品,维度的多员花,与一套强大的搜索引擎,那是非常必要的.今天我们主要是描述我们在从事电商搜索引擎过程中的遇到的一些问 ...

  2. 【后端面经-Java】HashMap详解

    目录 1. HashMap的家族定位 2. HashMap的数据结构 2.1 Hash表的基本概念 2.2 Hash冲突 2.3 HashMap数据结构 3. HashMap的重要变量 3.1 常量 ...

  3. Spring Boot集成Dubbo 3.X

    关注王有志,一个分享硬核Java技术的互金摸鱼侠 欢迎加入Java人的提桶跑路群:共同富裕的Java人 上一篇我们一起认识了Dubbo与RPC,今天我们就来一起学习如何使用Dubbo,并将Dubbo集 ...

  4. CF1580C Train Maintenance题解

    我们以 \(\sqrt m\) 为分界点来进行平衡. 设当前在进行第 \(k\) 次操作,询问 \(i\). 对于 \(x_i + y_i \leq \sqrt m\),可以在 \(last_{x_i ...

  5. 即构自研海量有序数据网络MSDN,构建全球可靠的多云通讯链路

    2020是实时音视频技术应用大爆发的一年,电商直播.视频会议.在线课堂等多个场景获得了广泛关注.即构科技作为全球领先的云通讯商,截止目前已服务超过4000家企业客户,每日音视频通话时长超过20亿分钟, ...

  6. 【阅读笔记】低照度图像增强-《Fast efficient algorithm for enhancement of low lighting video》

    本文介绍的是一种比较实用的低照度图像增强效果很好的方法,Xuan Dong论文<Fast efficient algorithm for enhancement of low lighting ...

  7. SwiftUI的认识与使用

      SwiftUI简介 SwiftUI是苹果推出的一个新的UI框架,它使用了声明的方式,通过视图,基础控件和布局控件来进行页面的开发. SwiftUI具有跨平台性,一份SwiftUI代码可以同时跑在i ...

  8. [minio]简介与安装

    简介 MinIO是一款高性能的分布式对象存储系统. 官网地址 特性 轻便 高性能 跨平台 高扩展性 云原生支持 兼容Amazon S3 基本概念 s3:simple storage service,简 ...

  9. CVE-2021-3156 Linux sudo权限提升漏洞复现

    前言: 现在最火的莫不过是这个linux sudo权限提升漏洞了,sudo命令可以说是在linux中十分出名的命令了,在运维时很多时候都需要用到sudo命令,通过此漏洞,可以对具有一定权限的普通用户, ...

  10. 宝塔linux网站搬家思路

    对于一个网站来说,其实就分为两个部分,一个是网站的源码,另一个就是网站的数据库. 那么对于网站搬家而言,要考虑的也就是两点,一是要打包网站的源码,再者就是要打包网站的数据库.其次就是要在新的站点,配置 ...