这篇博客集中整理在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)两条搜索路径,在搜索所有状态过程中,使用全局变量maxans来记录最大得分以及取得最大得分的状态数量。

代码

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的更多相关文章

  1. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  2. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  3. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  4. Leetcode刷题笔记(双指针)

    1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...

  5. LeetCode刷题笔记(1-9)

    LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...

  6. leetcode刷题笔记

    (1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...

  7. leetcode刷题笔记08 字符串转整数 (atoi)

    题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...

  8. LeetCode刷题笔记-回溯法-分割回文串

    题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...

  9. leetcode刷题笔记231 2的幂

    题目描述: 给定一个整数,写一个函数来判断它是否是2的幂. 题目分析: 判断一个整数是不是2的幂,可根据二进制来分析.2的幂如2,4,8,等有一个特点: 二进制数首位为1,其他位为0,如2为10,4为 ...

  10. leetcode刷题笔记342 4的幂

    题目描述: 给定一个整数 (32位有符整数型),请写出一个函数来检验它是否是4的幂. 示例:当 num = 16 时 ,返回 true . 当 num = 5时,返回 false. 问题进阶:你能不使 ...

随机推荐

  1. Linux定时运行Python代码

    背景 之前定时运行py文件都是jenkins设置定时任务运行,今天想linux有没有定时运行的东西,百度一下找到了,链接:http://blog.csdn.net/netdxy/article/det ...

  2. Jmeter四、jmeter脚本组成和组件搭配

    一.jmeter脚本开发原则 简单:去除无关的组件,同时能复用的尽量复用. 正确:对脚本或者业务正确性进行必要的判断,不能少也不能多(200) 高效:部分组件仅仅在脚本开发模式使用,在真正生产环境下不 ...

  3. mysql锁表原因及解决方法

    mysql锁表原因及解决方法   一.导致锁表的原因 1.锁表发生在insert update .delete 中: 2.锁表的原理是 数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到 ...

  4. 用js获取当前路由信息的方法

    1,设置或获取对象指定的文件名或路径.alert(window.location.pathname)2,设置或获取整个 URL 为字符串.alert(window.location.href);3,设 ...

  5. java计时器Timer

    基于java的计时器,定时发送消息 package timer; import java.lang.reflect.Array; import java.text.ParseException; im ...

  6. python+基本3D显示

    想要将双目照片合成立体图实现三维重建,完全没有头绪.但是对三维理解是必须的.所以将以前在单片机上运行的 3D画图 程序移植到python上.效果如下: 没有用numpy.openGL等,只用了纯mat ...

  7. Windows server 防火墙开放oracle监听端口

    Windows server 防火墙开放oracle监听端口 Windows server 2008 开放1521端口 Windows server 2003 开放监听程序例外先开防火墙,再开监听例外 ...

  8. 第七章 狄克斯特拉算法 (Dijkstra's algorithm)

    步骤 找出最便宜的节点,即可在最短时间内前往的节点 对于该节点的的邻居,检查是否有前往他们的更短路径,如果有,就更新其开销 重复这个过程,知道对图中的每个节点都这样做了 计算最终路径 条件 只适用于有 ...

  9. centos7中Firefox安装Flash插件

    第一步:先下载好Flash插件安装包,可以到Adobe官网下载.因为是linux 64位系统,所以要下个匹配的,我下载的是flash_player_npapi_linux.x86_64.tar.gz, ...

  10. samba缓存问题

    samba 在第一次登录时,会在windows上缓存着登录密码,当你重新修改samba服务端的密码, 再次登录时,windows会自动用缓存的旧密码登录,导致的登录失败.