前言

为日后的算法面试做准备,自己也很喜欢算法这个东西,每天3~5道题。

刷题

1.leetcode 209 长度最下的子数组

题目

长度最下的子数组

大致的意思是从数组中找到长度最小的数组,并且数组内的和是大于等于给定的数target

思路

最基本的思路当然是双重遍历,时间复杂度是O(N2),但是本题的数据大小为105,所以这是肯定过不掉的,所以我们需要优化。

我们可以发现的是,对于满足条件的某个区间,区间左右端点分别ij其中i表示最接近j的那个数的下标,当j向右移动的时候,i也会向右移动或者原地不动。所以我们可以用双指针来优化这个到O(N)。

代码

class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int res = INT_MAX;
//每次找的是能处于最左边的数
for(int i = 0, j = 0,sum_ = 0; j < nums.size();++j){
sum_ += nums[j];
while(sum_ - nums[i] >= target) sum_ -= nums[i++];
if(sum_ >= target)res = min(res, j - i + 1);
}
/*对于每个nums[j]找到的nums[i]是离nums[j]最近的那个满足sum_ >= target的数
每次这样维护是最小的
*/
if(res == INT_MAX) res = 0;
return res;
}
};

2.leetcode 208 实现Trie(前缀树)

题目

实现Trie(前缀树)

思路

就是Trie的模板题,我习惯用数组来模拟Trie树,所以打个板子题就好了,要用个check数组来维护一下最后一个数即可,大概把数据范围定在在8e4以上就可以过了。不过实测发现8e41e5的运行速度不一样,后者会快个20多ms,可能是因为在解析8e4的时候会慢一点?

然后有个细节是,用bool类型的check数组,因为bool的大小是1个字节,会相对于int小一点,在内存上会更加占优。

代码

const int N = 1e5;
int son[N][26], idx = 0;
bool check[N]; class Trie {
public:
Trie() {
memset(son, 0 ,sizeof(son));
memset(check, 0 ,sizeof(check));
} void insert(string word) {
int pos = 0;
for(int i = 0; word[i]; ++ i){
int temp = word[i] - 'a';
if(!son[pos][temp]) son[pos][temp] = ++idx;
pos = son[pos][temp];
//check[pos] = 1;
}
check[pos] = 1;
} bool search(string word) {
int pos = 0;
for(int i = 0; word[i]; ++ i){
int temp = word[i] - 'a';
if(!son[pos][temp]) return false;
pos = son[pos][temp];
}
if(check[pos]) return true;
else return false;
} bool startsWith(string prefix) {
int pos = 0,temp;
for(int i = 0; prefix[i]; ++ i){
temp = prefix[i] - 'a';
if(!son[pos][temp]) return false;
pos = son[pos][temp];
}
return true;
}
}; /**
* Your Trie object will be instantiated and called as such:
* Trie* obj = new Trie();
* obj->insert(word);
* bool param_2 = obj->search(word);
* bool param_3 = obj->startsWith(prefix);
*/

3.leetcode 201 数字范围按位与

题目

数字范围按位与

思路

对于leftright 我们会发现二进制表示中的两个数从左到右第一个不相等的数的后面按位与起来的后都是0.

也就是left可能是XXX0YYY,right可能是XXX1ZZZ,这是由于left小于right,我们还能发现XXX1000XXX0111肯定都在leftright的范围内,所以从第一个不相同的位向后与都是0.即答案是XXX0000

代码

class Solution {
public:
int rangeBitwiseAnd(int left, int right) {
int res = 0;
for(int i = 30; i >= 0; --i){
if((left >> i & 1) != (right >> i & 1)) {//lowbit操作
res = res << i + 1;
break;
}
else{
res = (res << 1) + (left >> i & 1);
}
}
return res;
}
};

注意点是lowbit操作一定要与上1,否则将一个数向左或者向右移动i位的话,得到的结果只会是移位后的结果。

2022.02.04 Day1的更多相关文章

  1. ROS的安装-> rosdep init /update报错2022.02.24实测有效

    ROS的安装-> rosdep init /update报错2022.02.24实测有效   一. 解决rosdep_init问题 正常执行sudo rosdep init会报错,如下: ERR ...

  2. 2022.02.27 CF811E Vladik and Entertaining Flags

    2022.02.27 CF811E Vladik and Entertaining Flags https://www.luogu.com.cn/problem/CF811E Step 1 题意 在一 ...

  3. 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)

    2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...

  4. 2022.02.21 UB

    2022.02.21 UB 参考资料: https://zhuanlan.zhihu.com/p/141467895 https://blog.csdn.net/ghscarecrow/article ...

  5. 2022.02.21 SA

    2022.02.21 SA 当我年少轻狂时,我曾拥有自由,但我并不明白它的意义.我曾拥有时间,但我没有意识到它的珍贵.我曾拥有爱,但我从未用心去体会.数十年的时间考验后,我终于理解了三者的真谛. 我已 ...

  6. 2022.02.20 SA

    2022.02.20 SA 如果我还能看见明天黎明,如果我还能再爬起来,我仍会走我的路,哪怕这条路已经荒废许久,也许我们无法拥有感情,我们甚至无法像个正常人一样接受太阳的洗礼,但是我依然会执行我的条约 ...

  7. [2017.02.04] C++学习记录(1)

    编编程语言的目的是帮助程序员以代码的形式表述ideas.编程语言一方面为程序员提供一组关于可以做什么的抽象,另一方面为程序员提供可以被机器执行的轮子.C++编程语言,支持4种编程范式:过程式(Proc ...

  8. C语言学习记录_2019.02.04

    逻辑性变量的定义符:bool,在C语言中只有true和false: 定义方式:bool t = true; 逻辑运算符: !:逻辑非 &&:逻辑与 ||:逻辑或 表达区间的错误形式:4 ...

  9. 2022.02.05 DAY2

    前言 今天陪老姐送对象去安庆了,上午还去了西风禅寺求了个签,第一次拿到中评签,看来今年还需要继续努力哈哈哈.一直到晚上才有时间去做点题目,今天依旧是leetcode. 题目 leetcode 1 两数 ...

随机推荐

  1. 51Nod 1279:扔盘子(二分||单调栈)

    1279 扔盘子 1.0 秒 131,072.0 KB 5 分 1级题 有一口井,井的高度为N,每隔1个单位它的宽度有变化.现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住( ...

  2. html5调用摄像头并拍照

    随着flash被禁用,flash上传附件的方式已成为过去,现在开始用html5上传了.本片文章就是介绍如何使用html5拍照,其实挺简单的原理: 调用摄像头采集视频流,利用canvas的特性生成bas ...

  3. OpenCV 可自动调整参数的透视变换

    在shiter大牛的基础之上,对于他的程序做了一定的修改. 首先,通过两个循环使得霍夫变换两个参数:角度的分辨率和点个数的阈值可以变换,这样就不必对于每一张图像都手动的设置阈值.其次,过滤掉了两个距离 ...

  4. 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具

    查看本章节 查看作业目录 需求说明: 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具 实现思路: 使用history对象中的 forward() 方法和 ...

  5. Hadoop组件启停命令和服务链接汇总

    1.启停命令 Zookeeper zkServer.sh start zkServer.sh stop/status/restart zkCli.sh -server IP:Port Hadoop(h ...

  6. 初识python: 继承

    继承:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承创建的新类称为"子类"或"派生类". 被继承的类称为"基 ...

  7. Thrift框架-安装

    1.前言 今天接触了使用 PRC[远程过程调用协议]的Thrift 框架  ,留下随笔心得,这是安装篇 2.下载 去apache官网下载Thrift脚本编译程序,window则下载一个exe文件,然后 ...

  8. Centos 7.6关闭selinux

    查看selinux状态 [root@localhost ~]# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SE ...

  9. POJCrossing River

    http://poj.org/problem?id=1700贪心问题 对于一个安排,怎么样是最小的?首先关于花费,对于每次运输,以最节约的方式运输.两种情况,一种最轻的作为往返,另外 一种是每次带一个 ...

  10. 深入理解MySQL索引底层数据结构

    作者:IT王小二 博客:https://itwxe.com MySQL 索引相关的数据结构有两种,一种是 B+tree,一种是 Hash,那么为什么在 99.99% 的情况下都使用的是 B+tree索 ...