LeetCode刷题笔记 - 2022
这篇博客集中整理在LeetCode的刷题记录,方便查阅
258. 各位相加 - 力扣(LeetCode) (leetcode-cn.com)
代码
class Solution {
public:
int addDigits(int num) {
int ans=999999;
while(ans >= 10)
{
ans=0;
while(num!=0)
{
ans = ans + num%10;
num/=10;
}
num=ans;
}
return ans;
}
};
401. 二进制手表 - 力扣(LeetCode) (leetcode-cn.com)
题目
二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。
例如,下面的二进制手表读取 "3:25" 。
给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。
小时不会以零开头:
例如,"01:00" 是无效的时间,正确的写法应该是 "1:00" 。
分钟必须由两位数组成,可能会以零开头:
例如,"10:2" 是无效的时间,正确的写法应该是 "10:02" 。
示例 1:
输入:turnedOn = 1
输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
示例 2:
输入:turnedOn = 9
输出:[]
提示:
0 <= turnedOn <= 10
思路
思路比较直接,就是枚举出这个二进制数的每一位,然后分别判定是否符合时间单位的标准,如果是的话就保存下来输出即可,主要还是要学习二进制位运算的相关操作。
C++代码
class Solution {
public:
vector<string> readBinaryWatch(int num) {
vector<string> res;
char str[10];
for(int i=0;i<1<<10;i++)//枚举每一位
{
int s=0;
for(int j=0;j<10;j++)
{
if(i>>j & 1)//如果i的第j位是1
s++;
}
if(s==num)
{
int a=i>>6, b=i&63;//63=各个位均为1,a取了i的小时(最高的四位)
if(a<12 && b<60)
{
sprintf(str, "%d:%02d", a, b);
res.push_back(str);
}
}
}
return res;
}
};
2104. 子数组范围和 - 力扣(LeetCode) (leetcode-cn.com)
思路
枚举计算出每个子数组之间最大值与最小值的差值并加在最终结果中即可
代码
class Solution {
public:
long long subArrayRanges(vector<int>& nums) {
int n = nums.size();
long long res=0;
for(int i=0;i<n;i++)
{
int minVal=INT_MAX, maxVal=INT_MIN;
for(int j=i;j<n;j++)
{
minVal = min(minVal, nums[j]);
maxVal = max(maxVal, nums[j]);
res+=maxVal - minVal;
}
}
return res;
}
};
521. 最长特殊序列 Ⅰ - 力扣(LeetCode) (leetcode-cn.com)
思路
究竟贪心题,如果两者长度相等,那么一定没有特殊串,如果长度不等,那么长的一串一定不会不特殊(短的再怎么删也不会变长)
代码
class Solution {
public:
int findLUSlength(string a, string b) {
if(a==b) return -1;
return max(a.size(), b.size());
}
};
504. 七进制数 - 力扣(LeetCode) (leetcode-cn.com)
代码
class Solution {
public:
string convertToBase7(int num) {
if(!num) return "0";
bool is_neg = num < 0;
num = abs(num);
string res;
while(num)
res+= to_string(num%7), num/=7;
reverse(res.begin(), res.end());
if(is_neg)
res = '-'+res;
return res;
}
};
LeetCode 2049. 统计最高分的节点数目
思路
在一棵树中,当把一个节点和与它相连的所有边删除,剩余部分最多是三棵非空子树,即原节点的左子树,右子树,以及把以这个节点为根结点的子树移除所形成的子树(除根结点外均有),最少数量则无此类特性。而题目中提到各节点的分数为这些子树的节点个数的乘积。我们可以先用 parents
数组统计出每个节点的子节点,然后使用深度优先搜索来计算以每个节点为根结点的子树的大小,同时计算每个节点的大小,作为深度优先搜索的返回值,最后统计最大分数出现的次数。在实现上,统计最大分数出现的次数可以放到深度优先搜索中完成,从而节省一部分空间。
代码
class Solution {
public:
long long n;
long long maxScore=0;
long long cnt=0;
vector<vector<int>> children;
int dfs(int node)
{
long long size = n-1;
long long score = 1;
for(int c:children[node])
{
int t = dfs(c);
score *= t;
size -= t;//算出节点大小,让size减去他
}
if(node != 0)
{
score *= size;
}
if(score == maxScore)
cnt++;
else if(score > maxScore)
{
maxScore = score;
cnt=1;
}
return n-size;
}
int countHighestScoreNodes(vector<int>& parents) {
this->n = parents.size();
this->children = vector<vector<int>> (n);
for(int i=0;i<n;i++)
{
int p = parents[i];
if(p!=-1)
{
children[p].emplace_back(i);//记录p节点的儿子节点
}
}
dfs(0);
return cnt;
}
};
LeetCode 599. 两个列表的最小索引总和
思路
利用哈希表存储后进行字符串索引查找,同时通过map
记录每个哈希值的索引数值大小
代码
class Solution {
public:
vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
unordered_map<string, int> hash;
for(int i=0;i<list1.size();i++)
hash[list1[i]] = i;
int sum = INT_MAX;
vector<string> res;
for(int i=0;i<list2.size();i++)
{
string& s = list2[i];
if(hash.count(s))
{
int k = hash[s] + i;
if(k < sum)
{
sum = k;
res = {s};
}
else if(k==sum)
{
res.push_back(s);
}
}
}
return res;
}
};
2044. 统计按位或能得到最大值的子集数目 - 力扣(LeetCode) (leetcode-cn.com)
思路
爆搜思路,对于任意一位 xx 而言,都有选和不选两种选择,分别对应了dfs(u + 1, val | nums[x])
和dfs(u + 1, val)
两条搜索路径,在搜索所有状态过程中,使用全局变量max
和ans
来记录最大得分以及取得最大得分的状态数量。
代码
class Solution {
public:
vector<int> nums;
int ans=0, max=0;
int countMaxOrSubsets(vector<int>& _nums) {
nums = _nums;
dfs(0,0);
return ans;
}
void dfs(int u, int val)
{
if(u == nums.size())
{
if(val > max)
{
max = val;
ans = 1;
}
else if(val == max) ans++;
return;
}
dfs(u+1, val | nums[u]);
dfs(u+1, val);
}
};
720. 词典中最长的单词 - 力扣(LeetCode) (leetcode-cn.com)
思路
先将输入的words
进行排序,规则为先按长度升序排序,在长度相同情况下再按照字典序降序排序,这样就可以保证我们在后面遍历每个单词时,比该单词短的全部子单词已全部遍历过,且每次遇到符合要求的单词一定是最长且字典序最小的单词,可以直接将其更新为答案。
代码
class Solution {
public:
string longestWord(vector<string>& words) {
sort(words.begin(), words.end(), [](const string &a, const string &b){
return a.size()!=b.size()?a.size()<b.size():a>b;
});
string longest;
unordered_set<string> candidates = {""};
for(auto &word : words)
{
if(candidates.count(word.substr(0, word.size() - 1)))
{
longest = word;
candidates.emplace(word);
}
}
return longest;
}
};
AcWing 606. 根据二叉树创建字符串
思路
递归方式遍历,如果确实存在左儿子右儿子则带上括号递归,如果不存在则直接返回当前节点数值即可,思路很简单
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
string tree2str(TreeNode* root) {
if(root == nullptr) return "";
if(root->left == nullptr && root->right == nullptr)
{
return to_string(root->val);
}
else if(root->right == nullptr)
{
return to_string(root->val) + "(" + tree2str(root->left) + ")";
}
else
{
return to_string(root->val) + "(" + tree2str(root->left) + ")("+ tree2str(root->right) + ")";
}
}
};
2039. 网络空闲的时刻 - 力扣(LeetCode) (leetcode-cn.com)
思路
可以将整个计算机网络视为一个无向图,服务器就是图中的节点,根据图中的边对应关系即可求出任意节点之间的距离,利用BFS先求出节点0到其他节点的最短距离,然后依次求出每个节点变为空闲的时间,当所有节点都变为空闲时,整个网络即变为空闲状态,因此网络的最早空闲时间即为各个节点中最晚的空闲时间。
设节点v与节点0之间最短距离位dist,则此时当节点v接收到主服务器节点0的最后一个回复后的下一秒,节点v变为空闲状态。节点v发送一个消息经过dist秒到达节点0,节点0回复消息并由节点v接收,因此节点v每发送一次消息后,经过\(2 \times dist\)秒才能收到回复,由于节点v会周期性每patience[v]
秒发送一次消息,因此需要分以下两种情况进行讨论:
- 当\(2 \times dist \leq patience[v]\)时,则此时节点v还未开始发送第二次消息就已收到回复,因此节点v只会发送一次消息,此时节点v变为空闲时间为\(2 \times dist+1\)
- 当\(2\times dist>patience[v]\)时,此时节点在等待第一次回复时就会开始重新发送消息,可知在\([1, 2\times dist)\)时间范围内最多再次发送\(\frac{2\times dist-1}{patience[i]}\)次消息,最后一次发送消息的时间为\(patience[v]\times \frac{2\times dist-1}{patience[v]}\),而节点每发送一次消息就会经过\(2\times dist[v]\)收到回复,因此节点v最后一次收到回复的时间为\(patience[v]\times \frac{2\times dist-1}{patience[v]}+2\times dist\),则此时可知节点v变空闲时间为\(patience[v]\times \frac{2\times dist-1}{patience[v]}+2\times dist+1\)
当\(2 \times dist \leq patience[v]\)时,\(\frac{2\times dist-1}{patience[v]}=0\),因此以上两种情况可以进行合并。
代码
class Solution {
public:
int networkBecomesIdle(vector<vector<int>>& edges, vector<int>& patience) {
int n = patience.size();
vector<vector<int>> adj(n);
vector<bool> visit(n, false);
for(auto &v: edges)
{
adj[v[0]].emplace_back(v[1]);
adj[v[1]].emplace_back(v[0]);
}
//BFS
queue<int> qu;
qu.emplace(0);
visit[0]=true;
int dist = 1;
int ans = 0;
while(!qu.empty()){
int sz = qu.size();
for(int i=0;i<sz;i++)
{
int curr = qu.front();
qu.pop();
for(auto &v : adj[curr]){
if(visit[v]) continue;
qu.emplace(v);
int time = patience[v] * ((2 * dist - 1) / patience[v]) + 2*dist + 1;
ans = max(ans, time);
visit[v]=true;
}
}
dist++;
}
return ans;
}
};
LeetCode刷题笔记 - 2022的更多相关文章
- LeetCode刷题笔记和想法(C++)
主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- Leetcode刷题笔记(双指针)
1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...
- LeetCode刷题笔记(1-9)
LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...
- leetcode刷题笔记
(1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...
- leetcode刷题笔记08 字符串转整数 (atoi)
题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...
- LeetCode刷题笔记-回溯法-分割回文串
题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...
- leetcode刷题笔记231 2的幂
题目描述: 给定一个整数,写一个函数来判断它是否是2的幂. 题目分析: 判断一个整数是不是2的幂,可根据二进制来分析.2的幂如2,4,8,等有一个特点: 二进制数首位为1,其他位为0,如2为10,4为 ...
- leetcode刷题笔记342 4的幂
题目描述: 给定一个整数 (32位有符整数型),请写出一个函数来检验它是否是4的幂. 示例:当 num = 16 时 ,返回 true . 当 num = 5时,返回 false. 问题进阶:你能不使 ...
随机推荐
- golang 生成Sqlserver数据表实体
最近开始学习golang,公司原来 很多项目都 Sqlserver数据库的,世面上很多文章,都是关于Mysql的,自己参考了一个博主的文章,整了一个生成Sqlserver实体的小工具分享一下,能给个星 ...
- (论文笔记)Learning Deep Structured Semantic Models for Web Search using Clickthrough Data
利用点击数据学习web搜索的深度学习模型 [总结] 该模型可以得到query和item的低维度向量表示,也可以得到二者的余弦语义相似度. 学习过程是通过最大化后验概率的极大似然估计得到的参数. ...
- 会话保持 Session和cookie
Session是什么? Session在网络中称为会话控制,是服务器为了保护用户状态而创建的一个特殊的对象,简而言之,session就是一个对象,用于存储信息. Session有什么用? sessio ...
- Debug --> python中的True False 0 1
今天看了下python中的一些基础知识,以offer64为例叭! 求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B ...
- 获取客户端ip,请求头伪造ip,解决办法
可以在请求头加入 X-Forwarder-For 来伪造访问的ip地址 //Nginx支持X-Forwarded-For 配置 proxy_set_header X-Forwarded-For $pr ...
- Shell脚本结构化-控制流
脚本结构化命令 上一章给出的那些 shell 脚本里,shell 按照命令在脚本中出现的顺序依次进行处理.对顺序操作来说,这已经足够了,因为在这种操作环境下,你想要的就是所有的命令按照正确的顺序执行. ...
- springboot启动图标banner
将springboot项目中的banner.txt文件替换成下面代码即可 ${AnsiColor.BRIGHT_YELLOW} ┏━┓ ┏━┓ ┏┛ ┻━━━━━┛ ┻┓ ┃ ┃ ┃ ━ ┃ ┃ ┳┛ ...
- SpringBoot 快速开启事务(附常见坑点)
序言:此前,我们主要通过XML配置Spring来托管事务.在SpringBoot则非常简单,只需在业务层添加事务注解(@Transactional )即可快速开启事务.虽然事务很简单,但对于数据方面是 ...
- redis和memcached区别总结
1.数据结构:redis支持五种数据结构(字符串,列表,哈希,集合,有序集合),并支持很多相 关计算,例如排序,阻塞等等.支持阻塞队列,锁,线程通信等功能.而memcached只支持kv简单存储 ...
- Vue+SSM+Element-Ui实现前后端分离(3)
前言:经过博文(1)vue搭建,(2)ssm搭建,到这里就该真真切切的实现小功能了<-_-> 规划:实现登录,用户列表查询,访问日志aop; 开始先解决跨域:在目录config/index ...