LeetCode C++刷题 49-52题题解

49、字母异位分词

题目:

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]
说明:

所有输入均为小写字母。
不考虑答案输出的顺序。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

1、回溯(超时)

2、map

代码:


class Solution {
private:
    vector<vector<string>> result;

public:
    // vector<vector<string>> groupAnagrams(vector<string>& strs) {
    //     //回溯
    //     for(int i = 0; i < strs.size(); i ++){
    //         vector<string> vec;
    //         vec.emplace_back(strs[i]);
    //         groupAnagrams(i, strs[i], "", vec);
    //     }
    //     return result;
    // }

    // void groupAnagrams(int i, string str, string now,vector<string> tmp){
    //     if(now.size() == str.size()){
    //         tmp.emplace_back(now);
            
    //         return;
    //     }
    //     for(int i = 0; i < str.size(); i ++){
    //         if(i > 0){
    //             if(str[i] == str[i - 1]){
    //                 continue;
    //             }else{
    //                 groupAnagrams(str, now + str[i], tmp);
    //             }
    //         }else{
    //             groupAnagrams(str, now + str[i], tmp);
    //         }
    //     }
    //     return;
    // }

      vector<vector<string>> groupAnagrams(vector<string>& strs) {
        //map
        map<string, vector<string>> hm;
        for(int i = 0; i < strs.size(); i ++){
            string tmp = strs[i];
            sort(tmp.begin(), tmp.end());
            if(hm.find(tmp) == hm.end()){
                hm[tmp] = {strs[i]};
            }else{
                hm[tmp].push_back(strs[i]);
            }
        }

        vector<vector<string>> result;
        for(map<string, vector<string>>::iterator it = hm.begin(); it != hm.end(); it++){
            result.push_back(it->second);
        }
        return result;
    }
};

50、Pow(x, n)

题目:

实现 pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

我也在不知道方法的名字

代码:

class Solution {
private:
    double result;
public:
    double myPow(double x, int n) {
        if(n == 0){
            return 1;
        }
        bool flag = true;
        long b = n;
        if( b < 0){
            x = 1/x;
        }
        b = abs(b);
        result = 1.0;

        while(b > 0){
            b = pow2(x, b);
        }
        return result;
    }

    long pow2(double x, long n){
        double tmp = x;
        long i = 1;
        while(i * 2 < n){
            i *= 2;
            tmp *= tmp;
        }
        result *= tmp;
        return n - i;
    }
};

51、N皇后

题目:

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

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

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

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

示例:

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

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

提示:

皇后,是国际象棋中的棋子,意味着国王的妻子。皇后只做一件事,那就是“吃子”。当她遇见可以吃的棋子时,就迅速冲上去吃掉棋子。当然,她横、竖、斜都可走一到七步,可进可退。(引用自 百度百科 - 皇后 )

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

回溯

代码:

class Solution {
private:
    vector<vector<string>> result;

public:
    vector<vector<string>> solveNQueens(int n) {
        vector<string> tmp(n, string(n, '.'));
        for( int i = 0; i <n; i ++)
        {
            tmp[0][i] = 'Q';
            solveNQueens(tmp, 0, i, n, 1);
            tmp[0][i] = '.';
        }
        return result;
    }

    void solveNQueens(vector<string> &tmp, int row, int col, int n, int temp){
        if(temp == n){
            if(isValid(tmp, row, col, n) && count(result.begin(), result.end(), tmp) == 0){
                result.push_back(tmp);
            }
            return;
        }
        for(int i = 0; i < n; i ++){
            if(isValid(tmp, row + 1, i, n)){
                tmp[row + 1][i] = 'Q';
                solveNQueens(tmp, row + 1, i, n, temp + 1);
                tmp[row + 1][i] = '.';
            }
        } 
        return;
    }

    bool isValid(vector<string> board, int row, int col, int n){
        //检查同列
        for(int i=0; i<row; i++){
            if(board[i][col]=='Q'){
                return false;
            }
        }
        //右上
        for(int i=row-1, j=col+1; i>=0 && j<n; i--, j++){
            if(board[i][j]=='Q'){
                return false;
            }
        }
        //左上
        for(int i=row-1, j=col-1; i>=0 && j>=0; i--, j--){
            if(board[i][j]=='Q'){
                return false;
            }
        }
        return true;

    }
};

52、N皇后II

题目:

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

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

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

示例:

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

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
 

提示:

皇后,是国际象棋中的棋子,意味着国王的妻子。皇后只做一件事,那就是“吃子”。当她遇见可以吃的棋子时,就迅速冲上去吃掉棋子。当然,她横、竖、斜都可走一或 N-1 步,可进可退。(引用自 百度百科 - 皇后 )

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

回溯

代码:

class Solution {

private:
    vector<vector<string>> result;
public:
    int totalNQueens(int n) {
        vector<string> tmp(n, string(n, '.'));
        for( int i = 0; i <n; i ++)
        {
            tmp[0][i] = 'Q';
            solveNQueens(tmp, 0, i, n, 1);
            tmp[0][i] = '.';
        }
        return result.size();
    }

    void solveNQueens(vector<string> &tmp, int row, int col, int n, int temp){
        if(temp == n){
            if(isValid(tmp, row, col, n) && count(result.begin(), result.end(), tmp) == 0){
                result.push_back(tmp);
            }
            return;
        }
        for(int i = 0; i < n; i ++){
            if(isValid(tmp, row + 1, i, n)){
                tmp[row + 1][i] = 'Q';
                solveNQueens(tmp, row + 1, i, n, temp + 1);
                tmp[row + 1][i] = '.';
            }
        } 
        return;
    }

    bool isValid(vector<string> board, int row, int col, int n){
        //检查同列
        for(int i=0; i<row; i++){
            if(board[i][col]=='Q'){
                return false;
            }
        }
        //右上
        for(int i=row-1, j=col+1; i>=0 && j<n; i--, j++){
            if(board[i][j]=='Q'){
                return false;
            }
        }
        //左上
        for(int i=row-1, j=col-1; i>=0 && j>=0; i--, j--){
            if(board[i][j]=='Q'){
                return false;
            }
        }
        return true;

    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cchangcs

谢谢你的支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值