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.rhkb.cn/news/332058.html

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

相关文章

计算机网络——TCP 协议的三次握手 / 四次挥手

简述 TCP / UDP 协议都是传输层的协议。 UDP 是面向无连接的协议&#xff0c;就是说发送端不在乎消息数据是否传输到接收端了&#xff0c;所以会出现数据丢失的情况&#xff0c;所以可靠性也不高。 TCP 是面向连接的、可靠的、基于字节流的传输层协议。所谓面向连接的&#…

机器学习算法手撕(一):KD树

import math import matplotlib.pyplot as pltclass Node:def __init__(self, data, leftNone, rightNone):self.data dataself.left leftself.right right# 创建KDTree类 class KDTree:def __init__(self, k):self.k kdef create_tree(self,dataset,depth):if not dataset…

SpringBoot使用rsa-encrypt-body-spring-boot实现接口加解密

废话不多说&#xff0c;直接上代码 引入依赖 <dependency><groupId>cn.shuibo</groupId><artifactId>rsa-encrypt-body-spring-boot</artifactId><version>1.0.1.RELEASE</version> </dependency>配置文件 rsa:encrypt:# 是…

电表远传抄表是什么?

1.电表远传抄表&#xff1a;简述 电表远传抄表&#xff0c;又称为远程控制自动抄表系统&#xff0c;是电力行业的智能化技术运用&#xff0c;它通过无线或通信网络技术&#xff0c;完成对电表数据信息的远程收集解决。此项技术不仅提升了抄水表高效率&#xff0c;降低了人工偏…

Java订餐系统源码 springboot点菜系统源码

Java订餐系统源码 springboot点菜系统源码 源码下载地址&#xff1a;https://download.csdn.net/download/xiaohua1992/89341358 功能介绍&#xff1a; 前台登录&#xff1a;前台登录&#xff1a; ①首页&#xff1a;菜品信息推荐、菜品信息展示、查看更多 ②菜品信息&…

【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数

本节博客是对阅读剑指offer后的笔记归纳总结&#xff0c;有需要借鉴即可。 目录 1.p21-p25内容概要2.询问语法概念常考&#xff1a;CPP关键字理解举例&#xff1a;sizeof空类 3.分析代码举例&#xff1a;类中拷贝构造的无限递归问题 4.写代码常考点&#xff1a;类内成员函数、迭…

keycloakAsana SSO对接配置

说明&#xff1a;Keycloak与Asana单点登录对接&#xff0c;Keycloak做IDP&#xff0c;Asana做SP&#xff1b; 一、环境信息 操作系统&#xff1a;ubuntu keycloak&#xff1a;21.1.2 Asana enterprise&#xff1b;更新apt软件包索引&#xff1a; sudo apt update检查是否已安…

数组-最接近给出数字的三数之和

题目描述 解题思路 这里使用三层for循环&#xff0c;暴力解法穷举所有三个数和的可能性&#xff0c;注意三层循环里的索引不要重复。 代码实现 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返…

Introduction of Internet 计算机网络概述

计算机网络的概念 计算机网络的定义&#xff1a; 多台独立的计算机通过通信线路实现资源共享的计算机系统 计算机网络的组成 资源子网&#xff1a;提供共享的软件资源和硬件资源 通信子网&#xff1a;提供信息交换的网络结点和通信线路 计算机网络类型 按照拓扑排序 星型…

Transformer详解(1)-结构解读

Transormer块主要由四个部分组成&#xff0c;注意力层、位置感知前馈神经网络、残差连接和层归一化。 1、注意力层(Multi-Head Attention) 使用多头注意力机制整合上下文语义&#xff0c;它使得序列中任意两个单词之间的依赖关系可以直接被建模而不基于传统的循环结构&#…

【C语言】八进制、十六进制

前言 在我们日常生活中使用的数往往是十进制的&#xff0c;而当我们学习C语言后我们会接触到许多不同的进制并且时常需要去思考与使用这些不同的进制&#xff08;尤其是2的幂相关的进制&#xff0c;因为这种计数系统比十进制更接近于计算机的二进制系统&#xff09;&#xff0…

【Linux初探】:解锁开源世界的神秘钥匙

文章目录 &#x1f680;一、了解Linux&#x1f525;二、Linux 的发行版❤️三、Linux应用领域&#x1f4a5;四、Linux vs Windows & mac &#x1f680;一、了解Linux Linux是一种自由、开放源代码的操作系统&#xff0c;它的内核由芬兰计算机科学家Linus Torvalds在1991年创…

手把手从0到1教你做STM32+FreeRTOS智能家居--第10篇之ASR-PRO语音识别模块

前言 先看实验效果&#xff0c;通过ASR-PRO语音智能识别控制模块&#xff0c;来控制STM32单片机实现对应的控制功能。因为后台好多小伙伴私信问用的是什么语音模块&#xff0c;并且很少在网上看到如何使用此模块相关的文章&#xff0c;所以我将会在本篇文章详细介绍一下此模块…

HTML蓝色爱心

目录 写在前面 HTML入门 完整代码 代码分析 运行结果 系列推荐 写在后面 写在前面 最近好冷吖&#xff0c;小编给大家准备了一个超级炫酷的爱心&#xff0c;一起来看看吧&#xff01; HTML入门 HTML全称为HyperText Markup Language&#xff0c;是一种标记语言&#…

【wiki知识库】01.wiki知识库前后端项目搭建(SpringBoot+Vue3)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 &#x1f33c;环境准备 想要搭建自己的wiki知识库&#xff0c;要提前搭建好自己的开发环境&#xff0c;后端我使用的是SpringBoot&#xff0c;前端使用的是Vue3&#xff0c;采用前后端分离的技术实现。同时使用了Mysql数…

浪潮信息IPF24:AI+时代,创新驱动未来,携手共创智慧新纪元

如今&#xff0c;数字化时代的浪潮席卷全球&#xff0c;人工智能已经成为推动社会进步的重要引擎。浪潮信息IPF24作为行业领先的AI技术盛会&#xff0c;不仅为业界提供了交流合作的平台&#xff0c;更在激发创新活力、拓展发展路径、加速AI技术落地等方面发挥了重要作用。 升级…

【调和级数】100321. 优质数对的总数 II

本文涉及知识点 调和级数 质数、最大公约数、菲蜀定理 LeetCode100321. 优质数对的总数 II 给你两个整数数组 nums1 和 nums2&#xff0c;长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以被 nums2[j] * k 整除&#xff0c;则称数对 (i, j) 为 优质数对&#…

手机版AI写作软件哪个好用?5款AI写作软件分享

在这个快节凑的时代&#xff0c;人们对于高效、便捷的创作方式很是追求。尤其是在人工智能技术发展迅速的今天&#xff0c;AI写作软件的出现&#xff0c;让很多自媒体创作者都会想到在手机上面进内容创作&#xff0c;这样不仅能提高工作效率&#xff0c;而且工作的自由度会更高…

ciscn2024(上传一下,有侵权什么的问题的话联系删除)

Web Simple_php 这个Simple_php一点儿也不Simple (⋟﹏⋞) 源码放这儿了&#xff1a; <?phpini_set(open_basedir, /var/www/html/); error_reporting(0);if(isset($_POST[cmd])){$cmd escapeshellcmd($_POST[cmd]); if (!preg_match(/ls|dir|nl|nc|cat|tail|more|flag…

Java中IO流类的体系

Java为我们提供了多种多样的IO流&#xff0c;我们可以根据不同的功能及性能要求挑选合适的IO流&#xff0c;如图所示&#xff0c;为Java中IO流类的体系。 从上图发现&#xff0c;很多流都是成对出现的&#xff0c;比如&#xff1a; FileInputStream/FileOutputStream&#xff0…