公众号做电影网站赚钱二维码小程序制作
公众号做电影网站赚钱,二维码小程序制作,做餐饮网站建设,wordpress极验2422.使用合并操作将数组转换为回文序列
题目链接#xff1a;merge-operations-to-turn-array-into-a-palindrome
解法#xff1a;
用双指针来解决。整体思路是#xff1a;从数组的左右两边开始看#xff0c;
如果 nums[left] nums[right]#xff0c;两边数字一样merge-operations-to-turn-array-into-a-palindrome
解法
用双指针来解决。整体思路是从数组的左右两边开始看
如果 nums[left] nums[right]两边数字一样left, right--继续比较中间的元素如果 nums[left] ! nums[right]两边数字不一样此时需要合并谁较小就让谁与其邻居元素合并并移动指针。同时要记录merge了一次。当 left 指针与 right 指针相遇的时候返回一共合并了几次。
这个题还有一个很重要的细节那就是在不断合并的过程中合并的元素可能会超出int类型的范围。int类型是4字节32位10进制最多表示10位。题目给出的array中元素范围是10进制的6位但不断合并的过程中可能超出。所以得单独定义用于合并的leftSum和rightSum类型为long。
参考题解双指针
边界条件
时间复杂度O(n)
空间复杂度O(1)
class Solution {
public:int minimumOperations(vectorint nums) {int n nums.size();int i 0, j n - 1;// 注意这里是long类型int类型是不行的因为后面merge的时候test case会超出32位8字节的限制// 也因为如此所以这俩值需要显式地提取出来通过 nums[left1] nums[left] 这种方式来更新是不行的long leftSum nums[0], rightSum nums[j];int res 0;while (i j) {if (leftSum rightSum) {j--;rightSum nums[j];res;} else if (leftSum rightSum) {i;leftSum nums[i];res;} else {i, j--;leftSum nums[i], rightSum nums[j];}}return res;}
};
200.岛屿的个数
题目链接number-of-islands
解法
每块岛屿可以看成相连的一个个节点只需把所有相连节点遍历殆尽并标上特殊值以记录该节点已访问过则遍历殆尽时证明一块岛屿已找到。
总体思想是从1个小岛开始通过遍历所有垂直和水平方向的节点把相邻的小岛连接起来变成一整块岛屿同时标上特殊值用来记录该节点已经访问过了。遍历完毕时一整块岛屿就找到了。再从另一个小岛开始继续遍历。
DFS找到为1的点然后访问下、上、左、右4个方位垂直和水平。如果遇到1就置为0表示访问过了再继续访问下上左右如果遇到0那么就是遇到水了该递归方向返回。如果点的所有递归都返回了那岛屿数量加1。然后再找下一个为1的点进行DFS。
BFS找到为1的点加入队列。弹出后访问下、上、左、右4个方位垂直和水平。如果遇到1就加入队列。先进先出。
参考题解LeetCode 200岛屿数量 Number of Islands - 知乎
边界条件无
时间复杂度O(M×N)其中 M 和 N 分别为行数和列数。
空间复杂度DFS的O(M×N)BFD的O(min(M,N) )在最坏的情况下全部为陆地队列的大小可以达到 min(MN)。
// DFS
class Solution {
public:int numIslands(vectorvectorchar grid) {if (grid.empty() || grid[0].empty()) return 0;int ROW grid.size();int COL grid[0].size();int res 0;for (int i0; iROW; i) {for (int j0; jCOL; j) {if (grid[i][j] 1) {dfs(grid, i, j, ROW, COL);res;}}}return res;}void dfs(vectorvectorchar grid, int i, int j, int ROW, int COL) {// 递归终止条件if (i 0 || j 0 || i ROW || j COL) return;if (grid[i][j] 0) return;grid[i][j] 0; // 置为0避免再次被搜索// 依次为下上左右这4个方向dfs(grid, i-1, j, ROW, COL);dfs(grid, i1, j, ROW, COL);dfs(grid, i, j-1, ROW, COL);dfs(grid, i, j1, ROW, COL);}
};
// BFS
class Solution {
public:int numIslands(vectorvectorchar grid) {if (grid.empty() || grid[0].empty()) return 0;int ROW grid.size();int COL grid[0].size();int res 0;for (int i0; iROW; i) {for (int j0; jCOL; j) {if (grid[i][j] 1) {bfs(grid, i, j, ROW, COL);res;}}}return res;}void bfs(vectorvectorchar grid, int i, int j, int ROW, int COL) {queueint deque;// 把二维表格展开为一维时的索引deque.push(i*COL j);while (!deque.empty()) {int idx deque.front();deque.pop();int i idx / COL, j idx % COL;// 别忘了不能越界要加 (i-1) 0 这个条件if ((i-1) 0 grid[i-1][j] 1) {grid[i-1][j] 0;deque.push((i-1)*COL j);}if ((i1) ROW grid[i1][j] 1) {grid[i1][j] 0;deque.push((i1)*COL j);}if ((j-1) 0 grid[i][j-1] 1) {grid[i][j-1] 0;deque.push(i*COL j-1);}if ((j1) COL grid[i][j1] 1) {grid[i][j1] 0;deque.push(i*COL j1);}}}
}; 694.不同岛屿的个数
题目链接number-of-distinct-islands
解法
这个题的整体思路和【200.岛屿的个数】差不多只是加了一个记录整块岛屿的形状。
整块岛屿的形状就是每个小岛的形状的列表。而形状定义为相对于左上角第1个小岛的位置的偏移量这样左上角第一个小岛的位置是(0, 0)下方的小岛则是(-1, 0)。这样通过DFS或者BFS可以得到这块岛屿上所有小岛的形状从而得到整块岛屿的形状列表。
如果两块岛屿相对各自左上角的小岛的位置偏移量的列表相同那么这两块岛屿形状相同。
要求不同的岛屿那么就要把形状列表加入set中进行去重。
最后求set的长度即可。
BFS实现的步骤繁琐一些。
参考题解https://blog.csdn.net/danspace1/article/details/86610850
边界条件无
时间复杂度O(mn)
空间复杂度O(mn)
// DFS
class Solution {
public:int numDistinctIslands(vectorvectorint grid) {if (grid.empty() || grid[0].empty()) return 0;int ROW grid.size();int COL grid[0].size();int res 0;// 左上角第1个小岛的位置为(0,0)先记录左上角再记录其他小岛的位置setvectorpairint,int shapes;for (int i0; iROW; i) {for (int j0; jCOL; j) {if (grid[i][j] 1) {vectorpairint,int posVec;// 左上角第1个小岛的位置为(0,0)pairint,int pos(0, 0);dfs(grid, i, j, posVec, pos);shapes.insert(posVec);res;}}}return shapes.size();}void dfs(vectorvectorint grid, int i, int j, vectorpairint,int posVec, pairint,int pos) {// 递归终止条件int ROW grid.size(), COL grid[0].size();if (i 0 || j 0 || i ROW || j COL) return;if (grid[i][j] 0) return;grid[i][j] 0; // 置为0避免再次被搜索posVec.push_back(pos);// 依次为下上左右这4个方向vectorpairint,int directions {{-1,0},{1,0},{0,-1},{0,1}};for (const auto d: directions) {// 计算相对左上角小岛的位置pairint,int newPos {pos.firstd.first, pos.secondd.second};dfs(grid, id.first, jd.second, posVec, newPos);}}
};
// BFS
class Solution {
public:int numDistinctIslands(vectorvectorint grid) {if (grid.empty() || grid[0].empty()) return 0;int ROW grid.size(),COL grid[0].size(), res 0;setvectorpairint, int shapes;for (int i0; iROW; i) {for (int j0; jCOL; j) {if (grid[i][j] 1) {vectorpairint,int posVec;pairint,int idx(i, j), pos(0, 0);bfs(grid, idx, posVec, pos);shapes.insert(posVec);res;}}}return shapes.size();}void bfs(vectorvectorint grid, pairint,int idx, vectorpairint,int posVec, pairint,int pos) {int ROW grid.size(), COL grid[0].size();// 需要两个队列一个装位置索引一个装形状queuepairint, int deque, posQue;// 同时记录位置和形状deque.push(idx), posQue.push(pos);// 同时加入到整个岛屿的形状列表中posVec.push_back(pos);while (!deque.empty()) {pairint,int curIdx deque.front();deque.pop();pairint,int curPos posQue.front();posQue.pop();vectorpairint,int directions {{-1,0},{1,0},{0,-1},{0,1}};for (const auto d: directions) {int row curIdx.first d.first;int col curIdx.second d.second;if (row0 || col0 || rowROW || colCOL) continue;if (grid[row][col] 0) continue;grid[row][col] 0;pairint,int newIdx, newPos;newIdx {row, col};newPos {curPos.firstd.first, curPos.secondd.second};deque.push(newIdx), posQue.push(newPos);posVec.push_back(newPos);}}}
};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/90448.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!