leetcode每日一题44

这篇具有很好参考价值的文章主要介绍了leetcode每日一题44。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

130. 被围绕的区域

图论
dfs/bfs
dfs代码框架

void dfs(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本节点所连接的其他节点) {
        处理节点;
        dfs(图,选择的节点); // 递归
        回溯,撤销处理结果
    }
}

思路:本题要求找到被x围绕的陆地,所以边界的陆地O肯定不符合条件。那么我们只要从周边找到陆地O然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地O都变成A,然后再去重新遍历地图的时候,把剩下的O变成X,再把所有的A变成O。

  1. 确认递归函数,参数
    一般情况,深搜需要 二维数组数组结构保存所有路径,需要一维数组保存单一路径,这种保存结果的数组,我们可以定义一个全局变量,避免让我们的函数参数过多。
    因为需要上下左右遍历,所以构建一个方向坐标
    int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};
    递归函数参数为地图,还有当前坐标x,y
    void dfs(vector<vector<char>>& board, int x, int y)
  2. 确认终止条件
    终止添加不仅是结束本层递归,同时也是我们收获结果的时候。
    另外,其实很多dfs写法,没有写终止条件,其实终止条件写在了, 下面dfs递归的逻辑里了,也就是不符合条件,直接不会向下递归。
    这个代码的终止条件就是写在递归逻辑里的。
    当前方向超出边界,停止当前方向的遍历
for(int i=0;i<4;i++){
	nextx=x+dir[i][0];
	nexty=y+dir[i][1];
	if(nextx<0||nextx>=board.size()||nexty<0||nexty>=board[0].size())
		continue;
	}
  1. 处理目前搜索节点出发的路径
    把当前节点改为A
    没必要回溯,得到坐标且坐标没有过界,则判断该节点是否是X或者A,若是,则停止当前方向的遍历
    若不是,就继续递归
class Solution {
public:
    int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1}; 
    void dfs(vector<vector<char>>& board, int x, int y){
        board[x][y]='A';
        for(int i=0;i<4;i++){
            int nextx=x+dir[i][0];
            int nexty=y+dir[i][1];
            if(nextx<0||nextx>=board.size()||nexty<0||nexty>=board[0].size())
                continue;
            if(board[nextx][nexty]=='X'||board[nextx][nexty]=='A')
                continue;
            dfs(board, nextx, nexty);
        }
        return;
    }
    void solve(vector<vector<char>>& board) {
        int n=board.size(), m=board[0].size();
        for(int i=0;i<n;i++)
        {
            if(board[i][0]=='O')
                dfs(board,i,0);
            if(board[i][m-1]=='O')
                dfs(board,i,m-1);
        }
        for(int j=0;j<m;j++)
        {
            if(board[0][j]=='O')
                dfs(board,0,j);
            if(board[n-1][j]=='O')
                dfs(board,n-1,j);
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if (board[i][j] == 'O') 
                    board[i][j] = 'X';
                if (board[i][j] == 'A') 
                    board[i][j] = 'O';
            }
        return;
    }
};

131. 分割回文串

回溯
切割问题类似组合问题
for循环表示在哪里切下第1刀
递归表示在第一刀的基础上,下面的几刀在哪切

  1. 递归函数的返回值以及参数
    定义两个全局变量,一个用来存放符合条件单一结果,一个用来存放符合条件结果的集合。
    vector<vector<string>> result;
    vector<string> path;
    函数里有两个参数,字符串s,还有记录本层递归的中从哪里开始切的startIndex
    void backtracking (const string& s, int startIndex)
  2. 递归函数终止条件
    字符串切完了就终止,把当前路径存到结果里
if(startIndex>=s.length()){
	result.push_back(path);
	return;
}
  1. 单层搜索的逻辑
    从startIndex开始,遍历startIndex后面所有的位置。如果startIndex到当前位置的字符串是回文子串,则加入当前路径。否则跳过
    然后递归当前位置的下一个位置为下一个递归的startIndex
    递归结束,回溯,弹出当前字符串
for(int i=startIndex; i<s.length();i++)
{
	if(isPalindrome(s, startIndex, i)){
		string str = s.substr(startIndex, i - startIndex + 1);
		path.push_back(str);
	}
	else continue;
	backtracking(s, i+1);
	path.pop_back();
}

然后要写是否是回文子串
双指针,一前一后对比

bool isPalindrome(const string& s, int startIndex, int end)
{
	for(int i=startIndex, int j=end;i<j; i++,j--)
	{
		if(s[i]!=s[j])
			return false;
		}
	return true;
}

整体代码文章来源地址https://www.toymoban.com/news/detail-805352.html

class Solution {
public:
    bool isPalindrome(const string& s, int startIndex, int end)
    {
        for(int i=startIndex,j=end;i<j; i++,j--)
        {
            if(s[i]!=s[j])
                return false;
            }
        return true;
    }
    vector<vector<string>> result;
    vector<string> path;
    void backtracking (const string& s, int startIndex) 
    {
        if(startIndex>=s.length()){
            result.push_back(path);
            return;
        }
        for(int i=startIndex; i<s.length();i++)
        {
            if(isPalindrome(s, startIndex, i)){
                string str = s.substr(startIndex, i - startIndex + 1);
                path.push_back(str);
            }
            else continue;
            backtracking(s, i+1);
            path.pop_back();
        }
        return;
    }
    vector<vector<string>> partition(string s) {
        result.clear();
        path.clear();
        backtracking(s, 0);
        return result;
    }
};

到了这里,关于leetcode每日一题44的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【力扣·每日一题】2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)

    题目链接 给你一个字符串 s 和一个整数 repeatLimit ,用 s 中的字符构造一个新字符串 repeatLimitedString ,使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全部字符。 返回 字典序最大的 repeatLimitedString 。 如果在字符串 a 和 b 不同的第一个位置,字符串 a 中

    2024年01月17日
    浏览(40)
  • 【LeetCode每日一题】——566.重塑矩阵

    矩阵 简单 566.重塑矩阵 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。 给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。 重构后

    2024年02月14日
    浏览(33)
  • 每日一题(LeetCode)----二分查找(一)

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 104 -104 = nums[i] = 104 nums 为 无重复元素 的 升序 排列数

    2024年02月08日
    浏览(40)
  • 【每日一题】Leetcode - 283. 移动零

    Leetcode - 283. 移动零 从右向左遍历,遇到0,就将后面所有元素前移,同时更新长度,使其减1,因为移动n次,倒数n位就被0占据,后续操作可忽略 前面的操作,从右向左,每次遇到0移动都要跑半个数组,慢在整体前移; 换个思路,从左向右,记录首个0的位置,将后面的第一

    2024年02月11日
    浏览(35)
  • 【LeetCode】每日一题:移除元素

    目录  题目: 思想1:暴力解法 思想2:创建一个temp数组  思想3:双指针 👻内容专栏:《LeetCode刷题专栏》 🐨本文概括: 27.移除元素 🐼本文作者:花 碟 🐸发布时间:2023.4.15 https://leetcode.cn/problems/remove-element/   点击跳转到LeetCode平台OJ页面(27.移除元素)  👉 示例1: 解

    2023年04月19日
    浏览(40)
  • LeetCode每日一题之 复写0

    目录 题目介绍: 算法原理: 特殊位置处理: 代码实现: 题目链接:. - 力扣(LeetCode) 这种对数组元素进行修改,移动的题目我们仍然可以使用双指针法,不过我们按照常规思路从左到右处理数组,不难发现如下这种问题: 当cur指向1时,让dest下一个元素复写cur指向的元素

    2024年04月23日
    浏览(24)
  • 【LeetCode每日一题】——85.最大矩形

    矩阵 困难 85.最大矩形 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例 1: 输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“

    2024年02月13日
    浏览(31)
  • 【LeetCode每日一题】——575.分糖果

    哈希表 简单 575.分糖果 Alice 有 n 枚糖,其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。 医生建议 Alice 要少摄入糖分,只吃掉她所有糖的 n / 2 即可(n 是一个偶数)。Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可

    2024年02月13日
    浏览(59)
  • leetcode每日一题:62. 不同路径

    系列:动态规划 语言:java 难度:中等 题目来源:Leetcode62. 不同路径 开启动态规划章节了!!欢迎您在留言和我一起完成每日打卡,以后每天8点半前发布每日一题。 原题链接:Leetcode62. 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )

    2023年04月22日
    浏览(35)
  • Leetcode每日一题——“移除元素”

    各位CSDN的uu们你们好呀,小雅兰又来啦,今天,小雅兰的内容是移除元素,下面,让我们进入Leetcode的世界吧   说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以

    2023年04月23日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包