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;
}
};