力扣热门算法题 169. 多数元素,200. 岛屿数量,199. 二叉树的右视图

169. 多数元素,200. 岛屿数量,199. 二叉树的右视图,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.29 可通过leetcode所有测试用例。

目录

169. 多数元素

解题思路

完整代码

Python

Java

169. 多数元素

解题思路

完整代码

Python

Java

199. 二叉树的右视图

解题思路

完整代码

Python

Java


169. 多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

解题思路

  1. 初始化:创建两个变量,一个用于存储潜在的多数元素(candidate),另一个用于计数(count)。
  2. 遍历数组:遍历数组中的每个元素,对于当前元素:
    • 如果count为零,我们假设当前的元素是潜在的多数元素,更新candidate
    • 如果当前元素等于candidate,增加count
    • 否则,减少count
  3. 由于多数元素的定义是出现次数大于n/2,所以遍历完成后candidate中存储的就是多数元素。

完整代码

Python
class Solution:def majorityElement(self, nums: List[int]) -> int:count = 0candidate = Nonefor num in nums:if count == 0:candidate = numcount += (1 if num == candidate else -1)return candidate
Java
public class Solution {public int majorityElement(int[] nums) {int count = 0;Integer candidate = null;for (int num : nums) {if (count == 0) {candidate = num;}count += (num == candidate) ? 1 : -1;}return candidate;}
}

169. 多数元素

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]
]
输出:1

示例 2:

输入:grid = [["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]
]
输出:3

解题思路

        要计算二维网格中岛屿的数量,我们可以采用深度优先搜索(DFS)。对于网格中的每个点,如果它是一个未被访问过的陆地,我们就从这个点开始进行深度优先搜索,将所有与之相连的陆地都标记为已访问,这样就可以找到一个完整的岛屿。我们对网格中的每个点都这样操作,就可以计算出岛屿的总数。

  1. 遍历网格:对于网格中的每个点,如果它是未被访问的陆地(即值为'1'),则将岛屿数量加一,并对该点进行深度优先搜索。
  2. 深度优先搜索(DFS)
    • 将当前点标记为已访问(即值设为'0'或其他非'1'的值)。
    • 检查当前点的四个方向(上、下、左、右),如果相邻的点是陆地(即值为'1'),则对该点递归执行深度优先搜索。
  3. 重复以上步骤,直到网格中的所有点都被访问过。

完整代码

Python
class Solution:def numIslands(self, grid: List[List[str]]) -> int:if not grid:return 0def dfs(i, j):if i < 0 or j < 0 or i >= len(grid) or j >= len(grid[0]) or grid[i][j] == '0':returngrid[i][j] = '0'  # Mark as visiteddfs(i+1, j)dfs(i-1, j)dfs(i, j+1)dfs(i, j-1)islands = 0for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j] == '1':dfs(i, j)islands += 1return islands
Java
public class Solution {public int numIslands(char[][] grid) {if (grid == null || grid.length == 0) {return 0;}int numIslands = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[i].length; j++) {if (grid[i][j] == '1') {dfs(grid, i, j);numIslands++;}}}return numIslands;}private void dfs(char[][] grid, int i, int j) {if (i < 0 || i >= grid.length || j < 0 || j >= grid[i].length || grid[i][j] == '0') {return;}grid[i][j] = '0'; // Mark as visiteddfs(grid, i + 1, j);dfs(grid, i - 1, j);dfs(grid, i, j + 1);dfs(grid, i, j - 1);}
}

199. 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

解题思路

  1. 检查空树:如果根节点为空,则直接返回空列表。
  2. 初始化:创建一个队列用于层次遍历,初始时只包含根节点。创建一个空列表用于存放结果。
  3. 层次遍历
    • 对于队列中的每个节点,记录当前层的节点数(即队列的长度)。
    • 依次处理当前层的每个节点:将其从队列中移除,并将其子节点(如果有的话)加入队列。
    • 将当前层的最后一个节点的值添加到结果列表中。
  4. 重复上述过程,直到队列为空。
  5. 返回结果列表。

完整代码

Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def rightSideView(self, root: Optional[TreeNode]) -> List[int]:if not root:return []result, queue = [], [root]while queue:levelLength = len(queue)for i in range(levelLength):node = queue.pop(0)# 如果是当前层的最后一个节点,加入结果列表if i == levelLength - 1:result.append(node.val)# 将子节点加入队列if node.left:queue.append(node.left)if node.right:queue.append(node.right)return result
Java
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
public class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null) return result;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int levelLength = queue.size();for (int i = 0; i < levelLength; i++) {TreeNode node = queue.poll();// 如果是当前层的最后一个节点,加入结果列表if (i == levelLength - 1) {result.add(node.val);}// 将子节点加入队列if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}}return result;}
}

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

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

相关文章

【数字孪生平台】使用 Three.js 以 3D 形式可视化日本新宿站地图

在本文中&#xff0c;我们将使用日本新宿站的室内地图数据&#xff0c;并使用 Three.js 将其进行 3D 可视化。更多精彩内容尽在数字孪生平台。 使用的数据 这次&#xff0c;我们将使用日本空间信息中心发布的“新宿站室内地图开放数据”的集成版本&#xff08;ShapeFile&#…

使用CRXjs、Vite、Vue 开发 Chrome 多页面插件,手动配置 vite.config.ts 和 manifest.json 文件

一、使用CRXjs、Vite、Vue 开发 Chrome 多页面插件&#xff0c;手动配置 vite.config.ts 和 manifest.json 文件 一、创建 Vue 项目 1. 使用 Vite 创建 Vue 项目 npm create vitelatest # npm yarn create vite # yarn pnpm create vite # pnpm选择 Vue 和 TS 进入项目…

Node.js v20.12.0 (LTS) 发布,带来这些主要功能!

Node.js 20.12.0&#xff08;LTS&#xff09;发布&#xff0c;看其版本号属于一个重大更新了&#xff0c;这些功能是基于 21.7.1 版本。 曾介绍过的主要功能 新增 crypto.hash() 方法加载和解析环境变量&#xff1a; process.loadEnvFile(path) path 参数可选&#xff0c;默认从…

Unity类银河恶魔城学习记录11-8 p110 Enemy modifiers源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili EnemyStat.cs using System.Collections; using System.Collections.Gener…

Midjourney绘图欣赏系列(十四)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

webpack项目打包console git分支、打包时间等信息 exec

相关链接 MDN toLocaleString child_process Node.js strftime 格式 代码 buildinfo.js const { execSync, exec } require("child_process"); // exec: 在 Windows 执行 bat 和 cmd 脚本// execSync 同步 // exec 异步// exec 使用方法 // exec(git show -s,…

LLMs之Mistral:Mistral 7B v0.2的简介、安装和使用方法、案例应用之详细攻略

LLMs之Mistral&#xff1a;Mistral 7B v0.2的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;Mistral AI首个7B模型发布于2023年9月&#xff0c;在基准测试中超越Llama 2 13B&#xff0c;一下子声名大振。Mistral 7B v0.2对应的指令调优版本Mistral-7B-Instruct-v0…

YOLOv9改进策略 :block优化 | 无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023 RIFormer

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; token mixer被验证能够大幅度提升性能&#xff0c;但典型的token mixer为自注意力机制&#xff0c;推理耗时长&#xff0c;计算代价大&#xff0c;而RIFormers是无需TokenMixer也能达成SOTA性能的极简ViT架构…

Verilog语法之always语句学习

always语法是Verilog_HDL中最常用的一种语法。 always过程语句和语句块组成的&#xff0c;语法格式如下所示。 always(敏感信号1 or 敏感信号2.....) always实现组合逻辑和时序逻辑。用always实现组合逻辑要将所有的敏感信号加入敏感列表中&#xff1b;用always实现时序逻辑时…

计算机毕业设计Python+Spark知识图谱高考志愿推荐系统 高考数据分析 高考可视化 高考大数据 大数据毕业设计 机器学习 深度学习 人工智能

学院&#xff08;全称&#xff09;&#xff1a; 专业&#xff08;全称&#xff09;&#xff1a; 姓名 学号 年级 班级 设计&#xff08;论文&#xff09; 题目 基于Spark的高考志愿推荐系统设计与实现 指导教师姓名 职称 拟…

SQLite中的隔离(八)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite版本3中的文件锁定和并发(七&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 数据库的“isolation”属性确定何时对 一个操作的数据库对其他并发操作可见。 数据库连接之间的隔离 如果使用两个不…

Android R 广播注册与发送流程分析

静态广播注册时序图 动态广播注册时序图 发送广播时序图 前言 广播接收器可以分为动态和静态&#xff0c;静态广播接收器就是在 AndroidManifest.xml 中注册的&#xff0c;而动态的广播接收器是在代码中通过 Context#registerReceiver() 注册的。 这里先从静态广播的流程开始…