| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> [AcWing算法基础课] Chapter1 基础算法(三) -> 正文阅读 |
|
[数据结构与算法][AcWing算法基础课] Chapter1 基础算法(三) |
双指针算法我们在快速排序和归并排序里就已经用到双指针算法了。 第一类:第一个指针指向序列1,第二个指针指向序列2 第二类:两个指针指向同一个序列
核心思想:将朴素算法优化到O(n) 问题1:有一个形如abc def hij的字符串,请输出每个单词(不含空格),每个单词占一行。
AcWing 799. 最长连续不重复子序列 我们规定,指针i是终点,指针j是起点,先枚举终点再枚举起点。
指针j的含义:j往左最远能到什么地方 优化思路: 我们枚举终点i的思路和朴素算法是一样的,看一下以每一个i为右端点的区间,它的左端点离它最远是在什么位置。 我们每一次将终点i移动一个位置,再去求一下新的j最左可以在什么位置。 当终点向后移动时,j一定不会往前走,具有单调性。所有可以优化朴素做法。
位运算应用1:求n的二进制表示中第k位 n=15= ( 1111 ) 2 (1111)_2 (1111)2? 先把第k位移到最后一位 n>>k 再看一下个位是几 x&1 所以公式为:n>>k&1 应用2:lowbit(x)的作用是返回x的最后一位1 x= ( 1010 ) 2 (1010)_2 (1010)2? lowbit(x)= ( 10 ) 2 (10)_2 (10)2? x= ( 101000 ) 2 (101000)_2 (101000)2? lowbit(x)= ( 1000 ) 2 (1000)_2 (1000)2? 公式:x&-x -x是补码,是原码的取反加一,即 -x=~x+1 AcWing 801. 二进制中1的个数
离散化(这里特指整数的有序的离散化) 我们现在有一些数值,它们的值域是[0,10^9] ,但是这些数的个数比较少,个数在[0,10^5]之间 这些数值的特点是:值域跨度很大,但是数量不多,比较稀疏 在有些情况下,我们可能需要以这些值为下标来解决问题,如果不做处理直接开一个数组,这是非常不现实的。 因此就需要把这个数值序列映射到从0或1开始的自然数
我们就用这个数的下标当作它离散化后的值,所以二分查找就可以找到数x在alls里的下标。 AcWing 802. 区间和 思路 把所有用到的下标存入alls内,排序去重,然后调用find函数将其映射到从1开始的自然数。 对整数x加上c就是:先求出x离散化后的值k,然后在离散化后的序列上进行a[k]+=c 在求[l,r]之间所有数的和时,先把l和r离散化到对应的下标位置 K l K_l Kl? K r K_r Kr?,再求一下a[ K l K_l Kl?]到a[ K r K_r Kr?]之间的所有数的和就可以了(使用前缀和)
自己造轮子实现一个unique函数
区间合并有很多个区间,如果两个区间有交集,就把它们合并成同一个区间 绿色为合并后的区间 先按照左端点的排序规则对所有区间进行排序 然后维护一个区间a,a后面的区间b和区间a可能有三种关系 区间b不可能在区间a前面,即区间b的左端点一定小于等于区间a的左端点,这是因为我们已经按照左端点的排序规则进行排序了。 情况为1(包含)时我们维护的区间不变,不需要操作;情况为2(有交集)时我们将区间a延长,情况为3(没有交集)时我们就可以把区间a放入答案中去,并将区间更新为b 当区间b和区间a没有交集时,说明区间b以及区间b后面的所有区间都不和a相交了,我们就将维护的区间更新为区间b AcWing 803. 区间合并
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:51:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |