LeetCode 41-50题
41. 缺失的第一个正数
难度困难770
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0] 输出: 3
示例 2:
输入: [3,4,-1,1] 输出: 2
示例 3:
输入: [7,8,9,11,12] 输出: 1
提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
看了一些解法是把数组当做哈希表...,这个技巧好像还用的不是很少哦
原地哈希 f(nums[i]) = nums[i] - 1
while (nums[i] > 0 && nums[i] <= len && nums[nums[i] - 1] != nums[i]) {
// 满足在指定范围内、并且没有放在正确的位置上,才交换
// 例如:数值 3 应该放在索引 2 的位置上
swap(nums, nums[i] - 1, i);
}
不断置换
class Solution {
public:int firstMissingPositive(vector<int>& nums) {for(int i=0;i<nums.size();i++){// nums[i]=3 nums[3-1]=nums[2] 所以将nums[2]与nums[i]while(nums[i]>0&&nums[i]<=nums.size()&&nums[nums[i]-1]!=nums[i])swap(nums[i],nums[nums[i]-1]);}int ans=1;for(int i=0;i<nums.size();i++){if(nums[i]==ans) ans++;}return ans;}
};
另一种哈希是负号标记
class Solution {
public:int firstMissingPositive(vector<int>& nums) {int n = nums.size();for (int& num: nums) {if (num <= 0) {num = n + 1;}}for (int i = 0; i < n; ++i) {int num = abs(nums[i]);if (num <= n) {nums[num - 1] = -abs(nums[num - 1]);}}for (int i = 0; i < n; ++i) {if (nums[i] > 0) {return i + 1;}}return n + 1;}
};作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/first-missing-positive/solution/que-shi-de-di-yi-ge-zheng-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
42. 接雨水
难度困难1644
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6
啊这.....解法有很多种...暴力、dp、双指针、单调栈....
class Solution {
public:int trap(vector<int>& height) {//接雨水//看不懂//就他妈离谱vector<int> newheight(height.size());vector<int> newheight2(height.size());vector<int> ans(height.size());int count=0;if(height.size()==0) return 0;//有墙的也能接啊,我们观察一下此处接的雨水和什么有关//2->(1,3) 4->(3,7) 5->(3,7) 6->(3,7) 9->(8,10)//左边最高和右边最高的较低的一个?newheight[0]=height[0];for(int i=1;i<height.size();i++){newheight[i]=max(height[i],newheight[i-1]);}newheight2[height.size()-1]=height[height.size()-1];for(int i=height.size()-2;i>=0;i--){newheight2[i]=max(height[i],newheight2[i+1]);}for(int i=0;i<height.size();i++){ans[i]=min(newheight[i],newheight2[i]);count+=ans[i]-height[i];}return count;}
};
43. 字符串相乘
难度中等475
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3" 输出: "6"
示例 2:
输入: num1 = "123", num2 = "456" 输出: "56088"
44. 通配符匹配
难度困难518
给定一个字符串 (s
) 和一个字符模式 (p
) ,实现一个支持 '?'
和 '*'
的通配符匹配。
'?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母,以及字符?
和*
。
示例 1:
输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入: s = "aa" p = "*" 输出: true 解释: '*' 可以匹配任意字符串。
示例 3:
输入: s = "cb" p = "?a" 输出: false 解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
示例 4:
输入: s = "adceb" p = "*a*b" 输出: true 解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".
示例 5:
输入: s = "acdcb" p = "a*c?b" 输出: false
这个题怎么和前面那个那么像啊,复习一下。
dp题,仔细做一下。/**/
45. 跳跃游戏 II
难度困难688
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是2
。从下标为 0 跳到下标为 1 的位置,跳1
步,然后跳3
步到达数组的最后一个位置。
不是DP,是贪心算法
/**/
46. 全排列
难度中等882
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] ]
class Solution {
public:unordered_map<int,bool> visit;vector<int> tmp;void get(int n,int sum,vector<int>& nums,vector<vector<int>> &ans){if(n>sum) return;if(n==sum){ans.push_back(tmp);return;}for(int i=0;i<nums.size();i++){if(visit[nums[i]]==false){tmp.push_back(nums[i]);visit[nums[i]]=true;get(n+1,sum,nums,ans);visit[nums[i]]=false;tmp.pop_back();}}}vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> ans;for(int i=0;i<nums.size();i++) visit[nums[i]]=false;get(0,nums.size(),nums,ans);return ans;}
};
47. 全排列 II
难度中等396
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1] ]
去重是怎么做的...?
//当前值用过了 或
//当前值等于前一个值: 两种情况://1 nums[i-1] 没用过 说明回溯到了同一层 此时接着用num[i] 则会与 同层用num[i-1] 重复//2 nums[i-1] 用过了 说明此时在num[i-1]的下一层 相等不会重复if(used[i] || (i>0 && !used[i-1] && nums[i] == nums[i-1])){//用过了continue;
}
48. 旋转图像
难度中等557
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix = [[1,2,3],[4,5,6],[7,8,9] ],原地旋转输入矩阵,使其变为: [[7,4,1],[8,5,2],[9,6,3] ]
void rotate(vector<vector<int>>& matrix) {//简单!!//从i,j变成了j ,n-1-i怎么办//不能用新的矩阵!!!int n=matrix.size();//三角的形状注意一些for(int i=0;i<n;i++){for(int j=0;j<i;j++){swap(matrix[i][j],matrix[j][i]);}}//每一行直接转动..for(int i=0;i<n;i++){for(int j=0;j<n/2;j++)swap(matrix[i][j],matrix[i][n-j-1]);}}
49. 字母异位词分组
难度中等463
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[["ate","eat","tea"],["nat","tan"],["bat"]
]
想不到排序啊hhhhhh,LeetCode搞得时间复杂度pstd了
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> res;unordered_map <string,vector<string> > m;for(string& s : strs){string t = s;sort(t.begin(),t.end());m[t].push_back(s); //t为单词的按顺序排列,作为key值,m[t]则为该单词的异位词构成的vector,作为value值}for(auto& n : m) //n为键和值组成的pairres.push_back(n.second);return res;}
};
LeetCode 41-50题相关推荐
- 刷题汇总(三)leetcode 精选50题 C++答案总结
题目来源 腾讯精选练习(50 题) 相关: 刷题汇总(一)leetcode 精选50题 JavaScript答案总结 刷题汇总(二)剑指Offer 66题 C++答案总结 刷题汇总(四)技术类编程题汇 ...
- 刷题汇总(一)leetcode 精选50题 JavaScript答案总结
题目来源 腾讯精选练习(50 题) 信息更新时间:2019-3-11,因为要准备面前端,就用js做了遍来熟悉JavaScript这门语言,50道题均已提交通过. GitHub地址:https://gi ...
- LeetCode第50题思悟——Pow(x, n)(powx-n)
LeetCode第50题思悟--Pow(x, n)(powx-n) 知识点预告 对边界值的处理意识: 对整数溢出的处理: 折半的思想 题目要求 实现 pow(x, n) ,即计算 x 的 n 次幂函数 ...
- LeetCode Week 5:第 41 ~ 50 题
专栏--LeetCode 文章目录 专栏--LeetCode 41. 缺失的第一个正数 42. 接雨水 43. 字符串相乘 44. 通配符匹配 45. 跳跃游戏 II 46. 全排列 47. 全排列 ...
- 《剑指 Offer I》刷题笔记 41 ~ 50 题
<剑指 Offer I>刷题笔记 41_50 排序(中等) 41. 最小的k个数# _解法1:排序 API + 数组复制 API 42. 数据流中的中位数 _解法1:暴力 搜索和回溯算法( ...
- 腾讯精选练习 50 题(Leetcode)笔记 PDF下载!
昨天在知识星球中立了一个Flag,第一步采取的行动就是把以前刷的"腾讯精选练习 50 题"重新梳理一下,就有了今天这本170多页的小册子. 这本小册子即可以作为学习数据结构与算法课 ...
- LeetCode刷题记录---腾讯精选练习 50 题
腾讯精选练习 50 题,后续刷到哪更新到哪~~~加油!
- c语言解析sql语句_sql语句面试50题(Mysql版附解析)
本人最近在自学sql,从开始学到自己写完本练习50题大概花了12天的时间. 学习路径:<sql基础教程>第1遍(3天)→知乎中的sql网课+leetcode刷题(4天)→牛客网刷题(2天) ...
- Leetcode重点250题
LeetCode重点250题 这个重点题目是把LeetCode前400题进行精简.精简方法如下: 删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于 ...
- sql语句练习50题(Mysql版-详加注释)
表名和字段 1.学生表 Student(s_id,s_name,s_birth,s_sex) --学生编号,学生姓名, 出生年月,学生性别 2.课程表 Course(c_id, ...
最新文章
- go定时器 每天重复_通过测试学习Go:Hello, World
- JAVA复习(CharSequence接口、RunTime类、System类、object类中的finalize())
- 前端:JS实现数组去重常用的六种方法介绍
- 给定数组,去掉0元素后将剩下的元素赋给新的数组
- OpenShift 4 之AMQ Streams(4) - 用Prometheus监控Kafka
- (转贴)正则表达式学习心得体会(5)
- 关于instanceof、isinstance和isAssignableFrom的区别
- 2022软考中级软件设计师---易混淆知识点总结1
- 计算机开机后无法网络拨号怎样处理,电脑不能拨号上网显示调制解调器已删除怎么办...
- Socks代理是什么意思?有什么用?
- 2019美亚杯个人赛刷题
- HTML基础期末速成笔记
- 面试干货!21个必知数据科学面试题和答案
- 微信里的小程序怎么制作
- 网络安全(2) -- 关于一次XSS攻击-图片(img标签)的onerror事件
- winmail不用服务器系统可以吗,用Winmail架设安全可靠的邮件服务器
- 计算机端口原理与作用
- 猴子摘香蕉问题-人工智能模拟
- python 自动化识别H5模板与UI设计是否一致
- 如何做好电影解说,值得收藏的电影解说文案网站,电影解说文案素材库网站
热门文章
- Springboot毕业设计毕设作品,汽车租赁系统 开题报告
- 等额本金和等额本息房贷公式推导
- Android Studio Lint 工具看完这一篇还不够
- 【关于微信小程序登录信息】 微信即将不再支持wx.getUserInfo() 授权弹出框 2018年5月12日
- varnish 缓存php,php实现监控varnish缓存服务器的状态
- 预测分析:R语言实现2.4 评估线性回归模型
- bidirectional PIM
- android 树叶飘落动画,逼真的HTML5树叶飘落动画
- 函数——哥德巴赫猜想
- 接入微信universal link微信校验不通过