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& nums) {
for(int i=0;i0&&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
另一种哈希是负号标记
class Solution {
public:
int firstMissingPositive(vector& 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& height) {
//接雨水
//看不懂
//就他妈离谱
vector newheight(height.size());
vector newheight2(height.size());
vector 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=0;i--){
newheight2[i]=max(height[i],newheight2[i+1]);
}
for(int i=0;i
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 visit;
vector tmp;
void get(int n,int sum,vector& nums,vector> &ans){
if(n>sum) return;
if(n==sum){
ans.push_back(tmp);return;
}
for(int i=0;i> permute(vector& nums) {
vector> ans;
for(int i=0;i
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>& matrix) {
//简单!!
//从i,j变成了j ,n-1-i怎么办
//不能用新的矩阵!!!
int n=matrix.size();
//三角的形状注意一些
for(int i=0;i
49. 字母异位词分组
难度中等463
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
想不到排序啊hhhhhh,LeetCode搞得时间复杂度pstd了
class Solution {
public:
vector> groupAnagrams(vector& strs) {
vector> res;
unordered_map > 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为键和值组成的pair
res.push_back(n.second);
return res;
}
};