算法打卡|Day1 数组part01
Day1 数组part01
今日任务:数组理论基础,704. 二分查找,27. 移除元素
Part1: 数组理论基础
文章链接:https://programmercarl.com/数组理论基础.html
重点:
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的(在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. 移除元素
思路
- 首先我们可以用暴力解法,用两个循环遍历整个数组,外层循环找数,每找到一个和目标值相等的数,内层循环就向前移动一位,注意最后要 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的更多相关文章
- LeetCode初级算法的Python实现--数组
LeetCode初级算法的Python实现--数组 # -*- coding: utf-8 -*- """ @Created on 2018/6/3 17:06 @aut ...
- 算法与数据结构基础 - 数组(Array)
数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...
- 前端与算法 leetcode 189. 旋转数组
目录 # 前端与算法 leetcode 189. 旋转数组 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 189. 旋转数组 题目描述 189. 旋转数组 概要 把他当做一到简单 ...
- 坐标轴刻度取值算法-基于魔数数组-源于echarts的y轴刻度计算需求
本文链接:https://blog.csdn.net/qq_26909801/article/details/96966372数值型坐标轴刻度计算算法前言算法描述上代码代码运行效果结语前言因实习的公司 ...
- KMP 算法中的 next 数组
KMP 算法中对 next 数组的理解 next 数组的意义 此处 next[j] = k:则有 k 前面的浅蓝色区域和 j 前面的浅蓝色区域相同: next[j] 表示当位置 j 的字符串与主串不匹 ...
- c语言经典算法——查找一个整数数组中第二大数
题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...
- 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案
之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...
- KMP算法 --- 深入理解next数组
在KMP算法中有个数组,叫做前缀数组,也有的叫next数组. 每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符. 当然它描述的也是子串的对称程度,程度越高,值 ...
- 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆
原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...
- 翻阅《数据结构与算法javascript描述》--数组篇
导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...
随机推荐
- SQL Server 2008/2012 完整数据库备份+差异备份+事务日志备份 数据库完整还原(一)
还原方案 数据库级(数据库完整还原) 还原和恢复整个数据库.数据库在还原和恢复操作期间会处于离线状态.SQL SERVER不允许用户备份或还原单个表.还原方案是指从一个或多个备份中还原数据.继而恢复数 ...
- 《系列二》-- 1、BeanFactory.getBean 总览
目录 一句话概括 1 书接上回 2 揭开 doGetBean() 的神秘面纱, 重要操作一览 3 必要的课外知识 3.1 bean 的作用域 Scope 有哪些 3.2 FactoryBean 是什么 ...
- 计算机网络那些事之 MTU 篇
哈喽大家好,我是咸鱼 今天我们来聊聊计算机网络中的 MTU (Maximum Transmission Unit) 什么是 MTU ? MTU(Maximum Transmission Unit)是指 ...
- 如何制作 GitHub 个人主页
人们在网上首先发现你的地方是哪里?也许你的社交媒体是人们搜索你时首先发现的东西,亦也许是你为自己创建的投资组合网站.然而,如果你使用GitHub来分享你的代码并参与开源项目,那么你的GitHub个人主 ...
- 创建 Code Interpreter Demo: 一次实践的探索
好消息,好消息,Code Interpreter可以测试使用了!!! 在这篇文章中,我们将探索如何创建一个 Code Interpreter Demo.提交一个2023年1-5月份的融资记录数据,让它 ...
- Linux网络设备命名规则简介
Linux网络设备命名规则简介 几年前, Linux内核为网络接口分配名称采用的是一种简单和直观的方式:一个固定的前缀和一个递增的序号.比如,内核使用eth0名称以标识启动后第一个加载的网络设备,第二 ...
- altas2.1.0编译、安装、集成CDH6.3.2
目录 altas2.1.0编译.安装.集成CDH6.3.2 一: Atlas源码下载 二: Atlas源码编译 1.修改altas项目主pom文件,即需要编译的CDH6.3.2对应版本信息 2.Atl ...
- 进程相关API
ID与句柄 如果我们成功创建一个进程,CreateProcess函数会给我们返回一个结构体,包括四个数 据:进程编号(ID).进程句柄.线程编号(ID).线程句柄. 进程ID其实我们早见过了,通常我们 ...
- Linux 上 KVM 虚拟机网络问题
通过控制台连接虚拟机,ping自己的ip,ping宿主机的ip,ping同网段的ip 1. 自己的ip也不通,先检查网络配置 2. 宿主机的ip不通,就要确认下虚拟机网卡的类型 对于macvlan网卡 ...
- 并发编程-FutureTask解析
1.FutureTask对象介绍 Future对象大家都不陌生,是JDK1.5提供的接口,是用来以阻塞的方式获取线程异步执行完的结果. 在Java中想要通过线程执行一个任务,离不开Runnable与C ...
