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

LeetCode 41-50题_第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 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

LeetCode 41-50题_第2张图片

上面是由数组 [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"

LeetCode 41-50题_第3张图片

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 的二维矩阵表示一个图像。

将图像顺时针旋转 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;
    }
};

 

你可能感兴趣的:(LeetCode面试题)