算法打卡|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 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...
随机推荐
- ISIS 综合实验;BGP 实验
目录 ISIS 综合实验 实验拓扑 实验需求 实验步骤 1.配置相应接口IP地址及环回口地址 2.配置 IS-IS,要求全网互通,R8的Loop X口暂不宣告 3. R1和R3直连,要求 R3 成为 ...
- 案例实践 | 某能源企业API安全实践
随着智能电网.全球能源互联网."互联网+电力".新电改的全面实施,分布式能源.新能源.电力交易.智能用电等新型业务不断涌现,运营模式.用户群体都将发生较大变化,电力市场由相对专业向 ...
- tSNE算法在自然语言处理中的应用:文本降维和可视化
目录 技术原理及概念 t-SNE(Toeplitz-Stochastic Neural Network)是一种常用的文本降维和可视化算法,它的核心思想是将高维文本数据映射到低维空间,同时保持数据的一致 ...
- JavaCV的摄像头实战之十三:年龄检测
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...
- 自动设置IP地址和自动获取IP地址bat批处理文件
自动设置IP地址.bat Echo offecho 手动设置IP地址....Netsh interface IP Set Addr "本地连接" Static 192.168.1 ...
- 使用libswresample库实现音频重采样
一.初始化音频重采样器 在音频重采样时,用到的核心结构是SwrContext,我们可以通过swr_alloc()获取swr_ctx实例,然后通过av_opt_set_int()函数和av_opt_se ...
- 2 opencv-python核心库模块core
core模块定义了opencv中的基础数据结构和基础运算,是整个库的核心模块.而mat数据结构是opencv中最重要的数据结构,是opencv中图像最常用的存储格式. 1 基本数据结构 opencv的 ...
- 现代C++(Modern C++)基本用法实践:五、智能指针
概述 c++效率较高的一个原因是我们可以自己定制策略手动申请和释放内存,当然,也伴随着开发效率降低和内存泄漏的风险.为了减少手动管理内存带来的困扰,c++提出了智能指针,可以帮助我们进行内存管理,有三 ...
- subprocess Python执行系统命令最优选模块
简介 subprocess 是 Python 中执行操作系统级别的命令的模块,所谓系级级别的命令就是如ls /etc/user ifconfig 等和操作系统有关的命令. subprocess 创建子 ...
- Java Maven Settings配置参考
介绍 快速概览 settings.xml文件中的 settings 元素包含用于定义以各种方式配置Maven执行的值的元素,如pom.xml,但不应绑定到任何特定项目或分发给受众.这些值包括本地仓库位 ...