代码随想录66——额外题目【回溯、贪心】:52N皇后II、649Dota2 参议院、1221分割平衡字符串
创始人
2024-02-23 06:56:43
0

文章目录

  • 1.52N皇后II
    • 1.1.题目
    • 1.2.解答
  • 2.649Dota2 参议院
    • 2.1.题目
    • 2.2.解答
  • 3.1221分割平衡字符串
    • 3.1.题目
    • 3.2.解答

1.52N皇后II

参考:代码随想录,52N皇后II;力扣题目链接

1.1.题目

在这里插入图片描述

1.2.解答

这道题和之前做过的 51.N皇后 是一模一样的,只不过51那道题是求所有的棋盘摆放的方案,而本题只需要知道所有的方案的个数。其实只是在统计结果的时候操作不同而已,其他都是一样的。

直接给出代码如下,和51题基本上是一样的。

int count;   // 最后的结果bool isValid(int row, int col, int n, vector& chess)
{// 判断列是否合法for(int i = 0; i < row; i++)if(chess[i][col] == 'Q')return false;// 判断左上是否合法for(int i = row-1, j=col-1; i >=0 && j>=0; i--, j--)if(chess[i][j] == 'Q')return false;// 判断右上是否合法for(int i = row-1, j=col+1; i >=0 && j& chess)
{// 2.回溯终止条件:放到了最后一行if(row == n){count++;  // 放满了棋盘格,得到一个合理的解}// 3.开始递归:遍历这一行的所有列for(int col = 0; col < n; col++){if(isValid(row, col, n, chess))  // 判断当前位置放一个皇后是否合法{chess[row][col] = 'Q';   // 放置皇后backtracking(row+1, n, chess);   // 递归chess[row][col] = '.';   // 回溯}} 
}int totalNQueens(int n)
{vector chess(n, string(n, '.'));  // 初始化棋盘格backtracking(0, n, chess);  // 然后开始遍历,放置皇后return count;   // 最后返回所有可能的结果
}

2.649Dota2 参议院

参考:代码随想录,649Dota2 参议院;力扣题目链接

2.1.题目

在这里插入图片描述
在这里插入图片描述

2.2.解答

TODO:暂时没有AC,看了代码随想录上的讲解,感觉还挺简单的,但是自己稍微换了一种写法就无法AC了,自己的写法如下:

感觉还是不太明白,因为当前的位置的R和T,都是要优先消灭后面的R和T,这样该怎么操作。

string predictPartyVictory(string senate)
{bool haveR = true;bool haveT = true;int numR = 0;   // 当前位置之前(包括当前位置)含有的R的个数int numT = 0;   // 当前位置之前(包括当前位置)含有的T的个数// 只要数组中还有R并且还有T,那么就还没有消灭完毕,则继续消灭while(haveR && haveT){// 先认为没有R和T了,如果后面执行过程中被修改成true了,则说明还有R和ThaveR = false;haveT = false;  for(int i = 0; i < senate.size(); i++){if(senate[i] == 'R'){numR++;   // 首先字符R的个数++if(numT >= numR)   // 如果当前位置前面的T个数 >= 当前位置R的个数,则可以消灭{senate[i] = 0;  // 消灭R,为下一次循环做准备numR--;}elsehaveR = true;   // 否则不能消灭R,置位}else if(senate[i] == 'T'){numT++;if(numR >= numT){senate[i] = 0;numT--;}elsehaveT = true;}}}return haveR == true ? "Radiant" : "Dire";  // 根据最后haveR还是T返回结果
}

3.1221分割平衡字符串

参考:代码随想录,1221分割平衡字符串;力扣题目链接

3.1.题目

在这里插入图片描述

3.2.解答

这道题目看起来好像很复杂,其实是非常简单的贪心。

从前向后遍历,只要遇到平衡子串,计数就+1,遍历一遍即可

局部最优:从前向后遍历,只要遇到平衡子串 就统计

全局最优:统计了最多的平衡子串。

局部最优可以推出全局最优,举不出反例,那么就试试贪心。

例如,LRLR 这本身就是平衡子串 , 但要遇到LR就可以分割

最后直接给出代码如下,非常简单:

int balancedStringSplit(string s)
{int result = 0; // 最后平衡字符串的个数int count = 0;  // 字符串中R的个数// 遍历一遍字符串,寻找平衡子串for (const auto &ch : s){if (ch == 'R')count++;elsecount--;if(count == 0)  // 遇到一个平衡子串result++;}return result;
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...