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. @FunctionalInterface注解的使用

    被@FunctionalInterface注解标记的类型表明这是一个函数接口.从概念上讲,函数接口只有一个抽象方法.如果接口声明的抽象方法覆写Object类的公共方法,那这方法不算作接口的抽象方法,因 ...

  2. WebAPI公开接口请求签名验证

    前言 现在的系统后端开发的时候,会公开很多API接口 对于要登录认证后才能访问的接口,这样的请求验证就由身份认证模块完成 但是也有些接口是对外公开的,没有身份认证的接口 我们怎么保证接口的请求是合法的 ...

  3. 西门子S7系列转以太网通讯处理器类型分析

    捷米特以太网通讯处理器用于西门子S7-200/SMART /S7-200/S7-300/S7-400/西门子数控840D.840DSL等PLC的以太网数据采集,支持工控领域内绝大多数SCADA软件,支 ...

  4. AI重塑千行百业,华为云发布盘古大模型3.0和昇腾AI云服务

    [中国,东莞,2023年7月7日]华为开发者大会2023(Cloud)7月7日在中国东莞正式揭开帷幕,并同时在全球10余个国家.中国30多个城市设有分会场,邀请全球开发者共聚一堂,就AI浪潮之下的产业 ...

  5. vue3中父组件与组件之间参数传递,使用(defineProps/defineEmits),涉及属性传递,对象传递,数组传递,以及事件传递

    Vue3 中子父组件之间的通信 一.父组件传递参数到子组件 采用defineProps 传递属性 父组件: <template> <div> <h1>这是父组件&l ...

  6. 使用SpringBoot+React搭建一个Excel报表平台

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 Excel报表平台是一款功能强大.操作简单的系统平台,可 ...

  7. maven项目创建后添加resources等文件夹

    maven项目初始化只生成src/main/resources目录,但是这个不够用,我们得创建 src/main/java目录 src/test/java目录 src/test/resources目录 ...

  8. 备份Ubunut已安装的软件包并在新的Ubuntu 系统上恢复

    0.查看已安装列表 dpkg -L xxxx.deb 1.备份 安装apt-clone: $sudo apt-get install apt-clone 提供一个保存备份文件的位置.我们在 /back ...

  9. Codeforces Round #885 (Div. 2) A-D

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...

  10. Java通用返回工具类Result

    通用返回类Result 前言:Java项目搭建时,常常需要去封装一个通用型的Result工具类,下面就是我自己封装的常用的返回类,可以直接使用.(有部分Swagger注解,使用时可忽略) 第一步.创建 ...