LeetCode 51-60题

51. N 皇后

难度困难603

皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

LeetCode 51-60题_第1张图片

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回所有不同的 皇后问题的解决方案。

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

 

示例:

输入:4
输出:[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

 

提示:

  • 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

判断j == col || i + j === row + col || i - j === row - col妙啊

class Solution {
public:
   
    vector> ans;
    bool isValid(vector s,int row,int col,int n){
        for (int i = 0; i < row; i++) { // 之前的行
            for (int j = 0; j < n; j++) { // 所有的列
                if (s[i][j] == 'Q' &&   // 发现了皇后,并且和自己同列/对角线
                        (j == col || i + j == row + col || i - j == row - col)) {
                        return false;             // 不是合法的选择
        }}
      }
      return true;
    }
    
    void get(int index,int sum,vector &s){
        if(index==sum){
            ans.push_back(s);return;
        }
        for(int i=0;i> solveNQueens(int n) {
        vector s(n, string(n, '.'));
        get(0,n,s);
        return ans;
    }
};

51题和52题一样 

53. 最大子序和

难度简单2414

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

class Solution {
public:
    int maxSubArray(vector& nums) {
        int maxn=nums[0];
        vector dp(nums.size());
        for(int i=0;imaxn) maxn=dp[i];
        }
        return maxn;
    }
};

54. 螺旋矩阵

难度中等489

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
class Solution {
public:
    vector spiralOrder(vector>& matrix) {
        vector ans;
        int n=matrix.size();
        int x=0;int y=0;
        if(n==0) return ans;
        int m=matrix.size();n=matrix[0].size();int cnt=m*n;
        while(cnt){
            for(int j=y;j=y;j--){
                ans.push_back(matrix[m-1][j]);
                cnt--;
            }
            if(cnt==0) break;
            m--;
            for(int i=m-1;i>=x;i--){
                ans.push_back(matrix[i][y]);
                cnt--;
            }
            if(cnt==0) break;
            y++;

        }
        return ans;
    }
};

55. 跳跃游戏

难度中等813

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
class Solution {
public:
    //贪心!!!!!
    //实时维护每次能跳到的最远位置
    bool canJump(vector& nums) 
{
	int k = 0;
	for (int i = 0; i < nums.size(); i++)
	{
		if (i > k) return false;
		k = max(k, i + nums[i]);
	}
	return true;
}

};

 

56. 合并区间

难度中等602

给出一个区间的集合,请合并所有重叠的区间。

 

示例 1:

输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。

 

提示:

  • intervals[i][0] <= intervals[i][1]
class Solution {
public:
    vector> merge(vector>& intervals) {
        sort(intervals.begin(),intervals.end());
        vector> ans;
        if(intervals.size()<=1) return intervals;
        // 以下是一个一个合并,等到结尾or无法合并时push_back.
        
        int x=intervals[0][0];
        int y=intervals[0][1];
        for(int i=1;iy){
                ans.push_back({x,y});
                if(i==intervals.size()-1) ans.push_back({tx,ty});
                x=tx;y=ty;
            }else{
                x=min(x,tx);
                y=max(y,ty);
                if(i==intervals.size()-1) ans.push_back({x,y});
            }
        }
        
        // for(int i=0;i

58. 最后一个单词的长度

难度简单240

给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。

如果不存在最后一个单词,请返回 0 。

说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串

 

示例:

输入: "Hello World"
输出: 5

写的啥啊,脑袋疼....

class Solution {
public:
    int lengthOfLastWord(string s) {
        if(s.size()==1&&s[0]!=' ') return 1;
        for(int i=s.size()-1;i>=0;i--){
            if(s[i]!=' '){
                int cnt=1;
                while(i--){
                    if(i>=0&&s[i]==' ') break; 
                    cnt++;
                    if(i==0) break;
                }
                return cnt;
            }
        }
        return 0;
    }
};

 

class Solution {
public:
    int lengthOfLastWord(string s){
        int len = s.size(), lastWordLen = 0;
        if (len == 0) return 0;

        for (int i = len - 1; i >= 0; i--) {
            if (s[i] != ' ') lastWordLen++;
            if (s[i] == ' ' && lastWordLen > 0) break;
        }

        return lastWordLen;
    }
};

 

 

59. 螺旋矩阵 II

难度中等236

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]
class Solution {
public:
    vector> generateMatrix(int n) {
        vector> ans(n,vector(n));
        int x=0;int y=0;
        if(n==0) return ans;
        int m=n;
        int cnt=m*n;int num=1;
        while(cnt){
            for(int j=y;j=y;j--){
                ans[m-1][j]=num++;
                cnt--;
            }
            if(cnt==0) break;
            m--;
            for(int i=m-1;i>=x;i--){
                ans[i][y]=num++;
                cnt--;
            }
            if(cnt==0) break;
            y++;

        }
        return ans;
    }
};

60. 第k个排列

难度中等381

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

给定 n 和 k,返回第 k 个排列。

说明:

  • 给定 n 的范围是 [1, 9]。
  • 给定 的范围是[1,  n!]。

示例 1:

输入: n = 3, k = 3
输出: "213"

示例 2:

输入: n = 4, k = 9
输出: "2314"

 

回溯,狗头,睡个午觉先...

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