TikTok真题第7天 | 2422.使用合并操作将数组转换为回文序列、200.岛屿的个数、694.不同岛屿的个数

2422.使用合并操作将数组转换为回文序列

题目链接: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(vector<int>& nums) {int n = nums.size();int i = 0, j = n - 1;// 注意这里是long类型,int类型是不行的,因为后面merge的时候,test case会超出32位8字节的限制// 也因为如此,所以这俩值需要显式地提取出来,通过 nums[left+1] += 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(M,N)。

// DFS
class Solution {
public:int numIslands(vector<vector<char>>& grid) {if (grid.empty() || grid[0].empty()) return 0;int ROW = grid.size();int COL = grid[0].size();int res = 0;for (int i=0; i<ROW; i++) {for (int j=0; j<COL; j++) {if (grid[i][j] == '1') {dfs(grid, i, j, ROW, COL);res++;}}}return res;}void dfs(vector<vector<char>>& 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, i+1, j, ROW, COL);dfs(grid, i, j-1, ROW, COL);dfs(grid, i, j+1, ROW, COL);}
};
// BFS
class Solution {
public:int numIslands(vector<vector<char>>& grid) {if (grid.empty() || grid[0].empty()) return 0;int ROW = grid.size();int COL = grid[0].size();int res = 0;for (int i=0; i<ROW; i++) {for (int j=0; j<COL; j++) {if (grid[i][j] == '1') {bfs(grid, i, j, ROW, COL);res++;}}}return res;}void bfs(vector<vector<char>>& grid, int i, int j, int ROW, int COL) {queue<int> 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 ((i+1) < ROW && grid[i+1][j] == '1') {grid[i+1][j] = '0';deque.push((i+1)*COL + j);}if ((j-1) >= 0 && grid[i][j-1] == '1') {grid[i][j-1] = '0';deque.push(i*COL + j-1);}if ((j+1) < COL && grid[i][j+1] == '1') {grid[i][j+1] = '0';deque.push(i*COL + j+1);}}}
};

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(vector<vector<int>>& grid) {if (grid.empty() || grid[0].empty()) return 0;int ROW = grid.size();int COL = grid[0].size();int res = 0;// 左上角第1个小岛的位置为(0,0),先记录左上角,再记录其他小岛的位置set<vector<pair<int,int>>> shapes;for (int i=0; i<ROW; i++) {for (int j=0; j<COL; j++) {if (grid[i][j] == 1) {vector<pair<int,int>> posVec;// 左上角第1个小岛的位置为(0,0)pair<int,int> pos(0, 0);dfs(grid, i, j, posVec, pos);shapes.insert(posVec);res++;}}}return shapes.size();}void dfs(vector<vector<int>>& grid, int i, int j, vector<pair<int,int>>& posVec, pair<int,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个方向vector<pair<int,int>> directions = {{-1,0},{1,0},{0,-1},{0,1}};for (const auto& d: directions) {// 计算相对左上角小岛的位置pair<int,int> newPos = {pos.first+d.first, pos.second+d.second};dfs(grid, i+d.first, j+d.second, posVec, newPos);}}
};
// BFS
class Solution {
public:int numDistinctIslands(vector<vector<int>>& grid) {if (grid.empty() || grid[0].empty()) return 0;int ROW = grid.size(),COL = grid[0].size(), res = 0;set<vector<pair<int, int>>> shapes;for (int i=0; i<ROW; i++) {for (int j=0; j<COL; j++) {if (grid[i][j] == 1) {vector<pair<int,int>> posVec;pair<int,int> idx(i, j), pos(0, 0);bfs(grid, idx, posVec, pos);shapes.insert(posVec);res++;}}}return shapes.size();}void bfs(vector<vector<int>>& grid, pair<int,int> idx, vector<pair<int,int>>& posVec, pair<int,int>& pos) {int ROW = grid.size(), COL = grid[0].size();// 需要两个队列,一个装位置索引,一个装形状queue<pair<int, int>> deque, posQue;// 同时记录位置和形状deque.push(idx), posQue.push(pos);// 同时加入到整个岛屿的形状列表中posVec.push_back(pos);while (!deque.empty()) {pair<int,int> curIdx = deque.front();deque.pop();pair<int,int> curPos = posQue.front();posQue.pop();vector<pair<int,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 (row<0 || col<0 || row>=ROW || col>=COL) continue;if (grid[row][col] == 0) continue;grid[row][col] = 0;pair<int,int> newIdx, newPos;newIdx = {row, col};newPos = {curPos.first+d.first, curPos.second+d.second};deque.push(newIdx), posQue.push(newPos);posVec.push_back(newPos);}}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端---css 元素溢出

1. 什么是 css 元素溢出 当子元素(标签)的尺寸超过父元素(标签)的尺寸时&#xff0c;此时需要设置父元素显示溢出的子元素的方式&#xff0c;设置的方法是通过overflow属性来完成。 overflow的设置项&#xff1a; visible 默认值, 显示子标签溢出部分。hidden 隐藏子标签溢出…

简易五子棋的实现(C++)

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#xff09; 目录 一、效果图二、代码&#xff08;带注释&#xff09;三、说明 一、效果图 二、代码&#xff08;带…

三、C#面向对象编程(封装与抽象类)

在C#中&#xff0c;封装和抽象类是面向对象编程中的重要概念。 封装&#xff1a;封装是把对象的状态信息隐藏在对象内部&#xff0c;不允许外部程序直接访问对象内部信息&#xff0c;而是通过该类提供的方法进行操作。封装提供了一种安全手段&#xff0c;保护对象的内部状态不…

day7--java高级编程:泛型,集合:集合数组互转,迭代器,增强for循环,集合工具类

4. 泛型 4.1 泛型概述 4.1.1 生活中的例子 举例1&#xff1a;中药店&#xff0c;每个抽屉外面贴着标签 举例2&#xff1a;超市购物架上很多瓶子&#xff0c;每个瓶子装的是什么&#xff0c;有标签 举例3&#xff1a;家庭厨房中&#xff1a; Java中的泛型&#xff0c;就…

Cytoscape3.8安装下载及安装教程

Cytoscape3.8下载链接&#xff1a;https://docs.qq.com/doc/DUmhZQ1lqTWhuSXJC 1.选中下载好的安装包右键选择“解压到 Cytoscape3.8.0”文件夹 2.打开解压好的”Cytoscape3.8.0“文件夹 3.选中“Cytoscape_3_8_0_windows_64bit.exe“右键以管理员身份运行 4.点击”Download“&…

网工内推 | 网络工程师,NP认证优先,上市公司,包吃,最高15薪

01 无锡先导智能装备股份有限公司 招聘岗位&#xff1a;高级网络工程师 职责描述&#xff1a; 1.依据项目规划方案提供硬件及网络方案设计&#xff1b; 2.面向客户提供网络技术支持&#xff0c;包括故障的解决、性能的优化、日常维护等&#xff1b; 3.和合作伙伴、供应商的技术…

2024.1.3 Spark on Yarn部署方式与工作原理

目录 Spark集群类型有以下几种&#xff1a; Spark的部署方式有以下几种&#xff1a; Spark on YARN的部署方式有两种&#xff1a;client模式和cluster模式。 Spark底层的工作原理,执行流程 Spark集群类型有以下几种&#xff1a; Standalone模式&#xff1a;这是Spark自带的…

产品Axure的安装以及组件介绍

Axure介绍&#xff1a; Axure是一款用户体验设计工具&#xff0c;可以用于创建交互式原型、线框图和设计文档。它支持快速原型开发、界面设计、信息架构、流程图和注释等功能&#xff0c;可以帮助设计师快速地创建和共享交互式原型&#xff0c;从而更好地与客户和团队协作。 …

【C++】HP-Socket(一): 下载、Linux上编译、Windows远程编译Linux版本

1、简介 国产、高性能、跨平台网络通信框架。 作者于2024-01-01更新了Release版本v5.9.4&#xff0c;辛苦了&#xff0c;向作者致敬&#xff01; 源码下载&#xff1a; https://gitee.com/mirrors/hp-socket https://github.com/ldcsaa/HP-Socket 2、编译 2.1 在Linux上编…

《Vue3 前端构建工具》 Vue-cli 与 Vite 创建项目的插件和配置对比

前言 2024 年 啦&#xff01;Vue2 也于 2023.12.31 寿终正寝 &#xff01; 然而我的 Vue3 升级一再拖延&#xff08;惭愧不已&#xff09;~ 赶起来吧~ 今天用 vue-cli 和 vite 分别创建了 Vue3 项目&#xff0c;具体实现步骤见如下两篇。 《基于 Vue Cli4.x Vue3 TS styl…

OceanBase入选Gartner®云数据库管理系统魔力象限“荣誉提及”

近日&#xff0c;全球IT市场研究和咨询公司Gartner发布最新报告《Magic Quadrant™ for Cloud Database Management Systems》&#xff08;全球云数据库管理系统魔力象限&#xff09;。全自研分布式数据库 OceanBase 入选“荣誉提及”&#xff0c;2022 年推出的云数据库 OB Clo…

QT+OSG/osgEarth编译之五十二:Imath+Qt编译(一套代码、一套框架,跨平台编译,版本:Imath-0.13)

Qt+OSG/osgEarth跨平台编译(用Qt Creator组装各个库,实现一套代码、一套框架,跨平台编译)_qt + osgearth安装-CSDN博客 目录 1、Imath介绍 2、文件下载 3、文件分析 4、pr

优思学院|为什么精益生产在你的企业就不管用呢?

精益生产&#xff08;Lean Production&#xff09;是一种旨在提高效率、减少浪费、优化流程的生产管理理念。然而&#xff0c;尽管它的理念广受推崇&#xff0c;但在实际应用中&#xff0c;许多企业却发现精益生产似乎并不奏效。那么&#xff0c;问题出在哪里呢&#xff1f; 企…

基于华为ENSP模拟器-vlan划分网络

需求 不连外网的内网。需求隔离故障和隔离广播风暴&#xff0c;并要保证网络的连通。 解决方案使用三层交互机&#xff0c;设置vlan用于隔离网络&#xff0c;并在三层交互机为网关保证各个vlan之间的通讯。 实现 使用三层交互机&#xff0c;设置vlan用于隔离网络&#xff0…

TB-C/C++

1.main函数之前之后执行的代码 设置栈指针初始化静态变量和全局变量&#xff08;.data段内容&#xff0c;已初始化且不为0&#xff09;赋初值&#xff08;.bss段内容&#xff0c;未初始化的全局变量和静态变量&#xff09;传参&#xff08;argc,argv&#xff09;atexit() 在…

Paddle3D 2 雷达点云CenterPoint模型训练

2 Paddle3D 雷达点云CenterPoint模型训练–包含KITTI格式数据地址 2.0 数据集 百度DAIR-V2X开源路侧数据转kitti格式。 2.0.1 DAIR-V2X-I\velodyne中pcd格式的数据转为bin格式 参考源码&#xff1a;雷达点云数据.pcd格式转.bin格式 def pcd2bin():import numpy as npimport…

【EDA软件】国产嘉立创EDA使用

嘉立创&#xff08;JLCPCB&#xff09; 嘉立创&#xff08;JLCPCB&#xff09;提供的EDA专业版是一款在线的原理图设计与PCB设计工具&#xff0c;可以协助用户完成电子设计项目。以下是使用嘉立创EDA专业版的一般步骤&#xff1a; 注册与登录&#xff1a; 首先&#xff0c;你需…

实习知识整理11:确认订单并将订单的相关信息插入用户订单表和订单详情表

用户订单表&#xff1a; 订单详情表&#xff1a; 思路分析&#xff1a;首先我们需要知道当点击了确认订单按钮后&#xff0c;需要向后端传递哪些数据&#xff0c;先看用户订单表&#xff1a;ORDER_ID是不需要传的&#xff0c;这个可以在后台生成就行了&#xff1b;USER_ID是需要…

go http升级为websocket举例

当使用 Go 语言编写 WebSocket 服务器时&#xff0c;可以使用 net/http 包来处理客户端的 HTTP 请求&#xff0c;并将其升级为 WebSocket 连接。以下是一个简单的示例代码&#xff1a; go package main import ( "fmt" "log" "net/http…

docker commit之后镜像越来越大解决办法

每次对docker的镜像进行增删改之后&#xff0c;它的体积都会扩充&#xff0c;甚至大到5G左右&#xff0c;在项目中是不可以接受的。 查找变大的原因为&#xff1a; docker容器就是以便于移植和部署著称。那么在docker使用过程中&#xff0c;少不了对容器进行反复的的打包和部署…