Leetcode算法题笔记(3)

目录

  • 矩阵
    • 101. 生命游戏
      • 解法一
      • 解法二
    • 102. 移掉 K 位数字
      • 解法一
    • 103. 去除重复字母
      • 解法一

矩阵

101. 生命游戏

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。

给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 (live),或 0 即为 死细胞 (dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。

进阶:

你可以使用原地算法解决本题吗?请注意,面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。
在这里插入图片描述

解法一

非原地算法:将矩阵复制一份,遍历旧矩阵每个元素的周围8个元素,计算存活细胞数量,再根据规则在新矩阵上进行修改,返回新矩阵(一下阶段状态矩阵)。空间复杂度过高O(mn)。

解法二

原地算法:空间复杂度过高O(1)。可以找一个复合状态同时表示旧状态和新状态,例如定义:

  • 如果细胞从活着变为死了,则复合状态为2;
  • 如果细胞从死了变成活了,则符合状态为3;
    之后便可按照算法一遍历元素,判断周围存活元素时,需要参考过去的状态,即值为1或2。最后重新遍历矩阵,将2,3变为对应的最新状态值0 , 1
class Solution {public void gameOfLife(int[][] board) {//定义如果细胞从活着变为死了,则复合状态为2;//如果细胞从死了变成活了,则符合状态为3;int row = board.length;int col = board[0].length;int[] neighbors = {-1,0,1};for(int i = 0; i < row ; ++i ){for(int j = 0; j < col ; ++j){int liveCount = 0;for(int e = 0;  e < 3 ; ++e){for(int f = 0; f < 3; ++f){if(!(neighbors[e] == 0 && neighbors[f] == 0)){int r = neighbors[e] + i;int c = neighbors[f] + j;if((r >= 0 && r < row) && (c >= 0 && c < col) && ( board[r][c] == 1 || board[r][c]  == 2)){++liveCount;}}}}if(board[i][j] == 1 && ( liveCount < 2 || liveCount > 3 )){board[i][j] = 2;}else if(board[i][j] == 0 && liveCount == 3){board[i][j] = 3;}}}for(int i = 0; i < row ; ++i ){for(int j = 0; j < col ; ++j){if(board[i][j] == 2) board[i][j] = 0;if(board[i][j] == 3) board[i][j] = 1;}}}
}

102. 移掉 K 位数字

给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
在这里插入图片描述

解法一

        单调栈+贪心算法:为了得到尽可能小的数字,其和位数以及高位上的数字大小是相关的。如果前面高位数(高到低)都是升序的,那么这个数是这些每位上的数所能排列出的最小整数,例如123 是 1,2,3能组成的最小数。因此,借鉴这一点,可以利用贪心思想,遍历字符串,每次尽可能得到最小的数,直至到末尾。
        维持一个当前最小的数需要使用一个单调栈,保证数字是升序排列。如果遇到比栈顶元素还要小的数,那么栈顶元素就应该弹出移除(且k-1),直至k为0(删除完成)或者当前元素比栈顶元素大(则需要将当前元素压栈,此时栈中又是一个升序栈)。例如124532,k = 3 ,当遍历到3时,4,5需要出栈,之后为1232,此时3需要出栈,最终结果为122
        有种可能情况:遍历完字符串后,单调栈已经是升序,但是k还不为0,依然需要删除数字,那么此时直接从最低位开始删即可,因为删除一位数字的总位数将会固定,而最低位数字最大,且能保证前面的数字依旧是排列最小的数,例如12345,删除5后,结果为1234。

class Solution {public String removeKdigits(String num, int k) {Deque<Character> list = new LinkedList<>();int len = num.length();for(int i = 0; i < len; ++i){char c = num.charAt(i);// int numi = Character.getNumericValue(c);while( !list.isEmpty() && k > 0 && list.peek() > c ){list.pop();k--;}list.push(c);}while(k > 0){list.pop();k--;}StringBuilder res = new StringBuilder();boolean flag = true;//用于判断数字最前端是否是连续0while(!list.isEmpty()){char digit = list.pollLast();if(flag && digit == '0'){continue;}flag = false;res.append(digit);}return res.length() == 0 ? "0" : res.toString();}
}

103. 去除重复字母

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的
字典序
最小(要求不能打乱其他字符的相对位置)。
在这里插入图片描述

解法一

        单调栈+贪心算法:根据题目可知,要求每个字母只能出现一次,且这些字母组成的字典序最小。当字符呈升序排列(a b c d e f…)时,字典序是最小的时候,因此可以尝试采用单调栈来维持最小字典序的子串。此外,尝试将其与贪心思想结合,遍历字符串,每次均保证当前单调栈维持的就是目前字典序最小的子串,进而推导出最终字典序最小的子串。

  • 遍历元素过程中,如果栈为空或者当前元素相较于栈顶元素是升序,则可以直接将当前元素压栈
  • 如果当前元素已经在栈中出现过,则可以直接丢弃当前元素。因为单调栈维持的是最小字典序的子串了,如果强行将该元素放入栈中,只可能会造成字典序增大或者无变化。例如栈中acd 当前c ,最多也只能让c 和 d 出栈,然后将当前c压栈,最后栈中为ac,得到的结果其实与原栈中acd前半部分几乎一样,但是少了d的信息。让当前c是否压栈对整体的最小字典序没有益处,并不能减小字典序,反而如果d是最后一个d了,那么d必须存在,则c无法压栈。因此当元素已经出现在栈中时,没有必要将其压栈处理。
  • 如果出现了与单调栈栈顶元素大小顺序不符元素,即需要看情况丢弃当前元素还是丢弃栈中的元素。如果该栈顶元素在字符串后面已经不存在同样的元素了,则说明该元素不能在被丢弃了,后续直接入栈当前元元素如果该栈顶元素在字符串后面还存在,则说明可以丢弃当前栈顶元素,由于栈中可能有连续几个比当前元素大的元素,所以可能会连续多出栈几个元素。例如 acbc ,栈中元素为ac,当前元素b,则c后面还有,因此可以弹出c ,压栈b,压栈最后一个c,即可得到比acb更小的字典序子串abc
class Solution {public String removeDuplicateLetters(String s) {Deque<Character> stack = new LinkedList<>();int len = s.length();boolean[] numVisit = new boolean[26];int[] count = new int[26];//初始化字符串中各字符的频次for(int i = 0; i < len ; ++i){count[s.charAt(i) - 'a']++;}for(int i = 0; i <len ;++i){char c = s.charAt(i);count[c - 'a']--;//说明元素已经存在于单调栈中,因此可以直接丢弃if(numVisit[c - 'a'] == true){continue;}//如果出现了与单调栈栈顶元素大小顺序不符元素,即需要看情况丢弃当前元素还是丢弃栈中的元素if(!stack.isEmpty() && stack.peek() >= c ){//如果元素小于栈顶元素,则说明有可能用当前元素替换栈顶元素以得到更小的字典序while(!stack.isEmpty() && stack.peek() > c){//如果该栈顶元素在字符串后面已经不存在同样的元素了,则说明该元素不能在被丢弃了,后续直接入栈当前元素if(count[stack.peek() - 'a'] == 0){break;}//如果该栈顶元素在字符串后面还存在,则说明可以丢弃当前栈顶元素numVisit[stack.poll() - 'a'] = false;}//让比之前栈顶元素更小的当前元素入栈stack.push(c);numVisit[c - 'a'] = true;}else{//当前元素符合单调栈中的单调性,因此直接压栈即可numVisit[c - 'a'] = true;stack.push(c);}}StringBuilder res = new StringBuilder();while(!stack.isEmpty()){res.append(stack.pollLast());}return res.toString();}
}

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

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

相关文章

.NET 直连SAP HANA数据库

前言 上个项目碰到的需求&#xff0c;IT部门要求直连SAP的HANA数据库&#xff0c;以只读的权限读取SAP部门开发的CDS视图&#xff0c;是个有点复杂的工程&#xff0c;需要从成品一直往前追溯到原材料的产地&#xff0c;和交货单、工单、采购订单有相当程度上的关联 IT部门要求…

基于java实现图片中任意封闭区域识别

需求&#xff1a; 在浏览器中给用户呈现一张图片&#xff0c;用户点击图片中的某些标志物&#xff0c;需要系统给出标志物的信息反馈&#xff0c;达到一个交互的作用。 比如下图中&#xff0c;点击某个封闭区域时候&#xff0c;需要告知用户点击的区域名称及图形形状特性等等。…

【因果推断python】2_因果关系初步2

目录 偏差 关键思想 偏差 偏差是使关联不同于因果关系的原因。幸运的是&#xff0c;我们的直觉很容易理解。让我们在课堂示例中回顾一下我们的平板电脑。当面对声称为孩子提供平板电脑的学校会获得更高考试成绩的说法时&#xff0c;我们可以反驳说&#xff0c;即使没有平板电…

【ai】livekit:Agents 3 : pythonsdk和livekit-agent的可编辑模式下的安装

livekit-agent 依赖于livekit、livekit-api、livekit-protocol 其中livekit就是livekkit-rtc: 包含俩sdk 实时互动sdkReal-time SDK for connecting to LiveKit as a participant livekit-api : 服务端sdk https://pypi.org/project/livekit-api/ livekit的python sdk

如何应对Android面试官 -> 玩转 Fragment

前言 本章主要讲解下 Framgent 的核心原理&#xff1b; 基础用法 线上基础用法&#xff0c;其他的可以自行百度 FragmentManager manager getSupportFragmentManager(); FragmentTransaction transaction manager.beginTransaction(); transaction.add(R.id.contentlayout,…

2018 年山东省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书

2018年山东省职业院校技能大赛高职组 “信息安全管理与评估”赛项任务书 赛项时间 8:30-13:00&#xff0c;共计4小时30分钟&#xff0c;含赛题发放、收卷时间。 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备配置防护 …

茅台领航,贵州白酒向前冲!

执笔 | 尼 奥 编辑 | 扬 灵 “茅台好&#xff0c;大家才好&#xff1b;大家好&#xff0c;茅台才会更好。”在2024年贵州白酒企业盛宴上&#xff0c;这股自信与豪情再度激荡&#xff0c;大家对茅台与贵州白酒产业的未来充满信心。 5月26日至27日&#xff0c;由贵州省白酒产…

一文读懂python同级目录的调用附Demo(详细解读)

目录 前言1. 问题所示2. 原理分析3. 解决方法3.1 添加父目录3.2 相对路径3.3 添加init 前言 通过制作简易的Demo&#xff0c;让其更加深入的了解如何使用 1. 问题所示 发现python的同级目录相互调用会出Bug E:\software\anaconda3\envs\py3.10\python.exe F:\python_project…

Django 里如何使用 sqlite (操作步骤)

在 settings.py 里&#xff0c;已经设定好 sqlite 了 DATABASES {default: {ENGINE: django.db.backends.sqlite3,NAME: BASE_DIR / db.sqlite3,} }必须得设置好app # 在 settings.py 里INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contentt…

Paddle使用问题No module named ‘paddle.fluid’

这是Paddle版本的问题&#xff0c;从飞桨框架 2.5 版本开始&#xff0c;已经废弃了 paddle.fluid 。 ​解决方案&#xff1a;修改paddle版本 pip install paddlepaddle2.4.0

使用递归形式以及迭代形式实现树的前中后序遍历

相信大家对于二叉树的遍历并不陌生&#xff0c;对于二叉树的递归遍历我们也可以信手拈来。但是如果让我们将二叉树修改成为非递归的形式呢&#xff1f;是不是有点疑惑了&#xff1f;那么本次博客我们就来梳理一下二叉树的非递归遍历。 由于递归遍历二叉树的代码以及逻辑都很简单…

(函数)判断素数(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明素数判断函数&#xff1b; void prime(int number);int main() {//初始化变量值&#xff1b;int number 0;//获取用户输入的数据&#xff1b;printf(&quo…

AI在肿瘤学临床决策中的应用:一种多模态方法

在临床肿瘤学领域&#xff0c;多模态人工智能&#xff08;AI&#xff09;系统通过解读各类医学数据&#xff0c;展现出提升临床决策的潜力。然而&#xff0c;这些模型在所有医学领域中的有效性尚未确定。本文介绍了一种新型的多模态医疗AI方法&#xff0c;该方法利用大型语言模…

JAVA 17

文章目录 概述一 语法层面变化1_JEP 409&#xff1a;密封类2_JEP 406&#xff1a;switch模式匹配&#xff08;预览&#xff09; 二 API层面变化1_JEP 414&#xff1a;Vector API&#xff08;第二个孵化器&#xff09;2_JEP 415&#xff1a;特定于上下文的反序列化过滤器 三 其他…

手机投屏技巧:手机怎么投屏到电脑显示屏上?精选6招解决!

手机怎么投屏到电脑显示屏上&#xff1f;出于一些不同的原因&#xff0c;大多数人都希望能将手机投屏到电脑上。其中一个常见的原因是&#xff0c;大家经常会希望在笔记本电脑上共享图片&#xff0c;而无需上传或者登录微信进行文件传输。以及希望不依靠投影仪&#xff0c;就能…

只刷题可以通过PMP考试吗?

咱们都知道&#xff0c;PMBOK那本书&#xff0c;哎呀&#xff0c;读起来确实有点费劲。所以&#xff0c;有些人就想了&#xff0c;干脆我就刷题吧&#xff0c;题海战术&#xff0c;没准儿也能过。这话啊&#xff0c;听起来似乎有点道理&#xff0c;但咱们得好好琢磨琢磨。 刷题…

【YashanDB知识库】自动选举配置错误引发的一系列问题

问题现象 问题出现的步骤/操作&#xff1a; ● 配置自动选举&#xff0c;数据库备库手动发起switch over&#xff0c;命令会报错 ● 主、备库变为只读状态&#xff0c;数据库无法进行读写操作 ● shutdown immediate 停止数据库&#xff0c;此时发现数据库一直没有退出&…

论文笔记:Vision GNN: An Image is Worth Graph of Nodes

neurips 2022 首次将图神经网络用于视觉任务&#xff0c;同时能取得很好的效果 1 方法 2 架构 在计算机视觉领域&#xff0c;常用的 transformer 通常是 isotropic 的架构&#xff08;如 ViT&#xff09;&#xff0c;而 CNN 更喜欢使用 pyramid 架构&#xff08;如 ResNet&am…

开源数据库同步工具DBSyncer

前言&#xff1a; 这么实用的工具&#xff0c;竟然今天才发现&#xff0c;相见恨晚呀&#xff01;&#xff01;&#xff01;&#xff01; DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供M…

必看项目|多维度揭示心力衰竭患者生存关键因素(生存分析、统计检验、随机森林)

1.项目背景 心力衰竭是一种严重的公共卫生问题,影响着全球数百万人的生活质量和寿命,心力衰竭的病因复杂多样,既有个体生理因素的影响,也受到环境和社会因素的制约,个体的生活方式、饮食结构和医疗状况在很大程度上决定了其心力衰竭的风险。在现代社会,随着生活水平的提…