力扣爆刷第93天之hot100五连刷51-55

2024-03-13 19:52

本文主要是介绍力扣爆刷第93天之hot100五连刷51-55,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

力扣爆刷第93天之hot100五连刷51-55

文章目录

      • 力扣爆刷第93天之hot100五连刷51-55
      • 一、200. 岛屿数量
      • 二、994. 腐烂的橘子
      • 三、207. 课程表
      • 四、208. 实现 Trie (前缀树)
      • 五、46. 全排列

一、200. 岛屿数量

题目链接:https://leetcode.cn/problems/number-of-islands/description/?envType=study-plan-v2&envId=top-100-liked
思路:很经典的图论,广度优先和深度优先都可以,求岛屿数量关键是把遍历过的岛屿进行标记,避免重复遍历。

class Solution {public int numIslands(char[][] grid) {int count = 0;for(int i = 0; i < grid.length; i++) {for(int j = 0; j < grid[0].length; j++) {if(grid[i][j] == '1') {count++;dfs(grid, i, j);}}}return count;}void dfs(char[][] grid, int x, int y) {if(x < 0 || x >= grid.length || y < 0 || y >= grid[0].length) return ;if(grid[x][y] == '0') return;grid[x][y] = '0';dfs(grid, x - 1, y);dfs(grid, x + 1, y);dfs(grid, x, y - 1);dfs(grid, x, y + 1);}}

二、994. 腐烂的橘子

题目链接:https://leetcode.cn/problems/rotting-oranges/description/?envType=study-plan-v2&envId=top-100-liked
思路:本题是一个多源头同步扩散,所以需要使用广度优先,用队列来模拟二叉树的层序遍历,控制所有的源头进行一圈一圈的扩散。

class Solution {int count = 0;Deque<int[]> queue = new LinkedList<>();public int orangesRotting(int[][] grid) {int freeNum = 0;for(int i = 0; i < grid.length; i++) {for(int j = 0; j < grid[0].length; j++) {if(grid[i][j] == 1) {freeNum++;} if(grid[i][j] == 2) {queue.add(new int[]{i, j});}}}while(!queue.isEmpty()) {if(freeNum == 0) return count;count++;int size = queue.size();for(int i = 0; i < size; i++) {int[] temp = queue.poll();int x = temp[0], y = temp[1];freeNum -= roting(grid, x-1, y);freeNum -= roting(grid, x+1, y);freeNum -= roting(grid, x, y-1);freeNum -= roting(grid, x, y+1);}}return freeNum > 0 ? -1 : count;}int roting(int[][] grid, int x, int y) {if(x < 0 || y < 0 || x > grid.length - 1 || y > grid[0].length - 1 || grid[x][y] != 1) {return 0;}grid[x][y] = 2;queue.add(new int[]{x, y});return 1;}
}

三、207. 课程表

题目链接:https://leetcode.cn/problems/course-schedule/description/?envType=study-plan-v2&envId=top-100-liked
思路:根据题目要求需要构建邻接表,然后我们要判断邻接表是否成环,visited数组使用来记录访问过的节点,避免重复访问,flags数组是用来记录从任意一个节点出发是否成环,如果成环则无法完成课程表。
另外就是关于flags数组的使用,单纯的利用visisted是无法判断是否成环的,如下图只遍历邻接表的0和1会发现0重复遍历,但是不成换。。
在这里插入图片描述

class Solution {boolean[] visited;boolean[] flags;boolean hasCycle = false;public boolean canFinish(int numCourses, int[][] prerequisites) {visited = new boolean[numCourses];flags = new boolean[numCourses];List<Integer>[] graph = build(numCourses, prerequisites);for(int i = 0; i < numCourses; i++) {traverse(graph, i);}return !hasCycle;}void traverse(List<Integer>[] graph, int i) {if(flags[i]) {hasCycle = true;}if(visited[i] || hasCycle) return;visited[i] = true;flags[i] = true;for(int t : graph[i]) {traverse(graph, t);}flags[i] = false;}List<Integer>[] build(int numCourses, int[][] prerequisites) {List<Integer>[] graph = new ArrayList[numCourses];for(int i = 0; i < numCourses; i++) {graph[i] = new ArrayList();}for(int[] edge : prerequisites) {graph[edge[1]].add(edge[0]);}return graph;}
}

四、208. 实现 Trie (前缀树)

题目链接:https://leetcode.cn/problems/implement-trie-prefix-tree/description/?envType=study-plan-v2&envId=top-100-liked
思路:利用单词构建多叉树,然后遍历多叉树。

class Trie {Node root = null;class Node{int v = 0;Node[] child = new Node[26];}public Trie() {}public void insert(String word) {// if (search(word)) {//     return;// }root = addNode(root, word, 0);}public boolean search(String word) {Node node = getNode(root, word);if (node == null || node.v == 0) {return false;}return true;}public boolean startsWith(String prefix) {return getNode(root, prefix) != null;}Node getNode(Node node, String word) {Node p = node;for (int i = 0; i < word.length(); i++) {if (p == null) {return null;}p = p.child[word.charAt(i)-'a'];}return p;}Node addNode(Node node, String word, int i) {if (node == null) {node = new Node();}if (i == word.length()) {node.v = 1;return node;}int c = word.charAt(i) - 'a';node.child[c] = addNode(node.child[c], word, i+1);return node;}
}/*** Your Trie object will be instantiated and called as such:* Trie obj = new Trie();* obj.insert(word);* boolean param_2 = obj.search(word);* boolean param_3 = obj.startsWith(prefix);*/

五、46. 全排列

题目链接:https://leetcode.cn/problems/permutations/description/?envType=study-plan-v2&envId=top-100-liked
思路:全排列不需要指定起始位置,只需要纵向去重即可。

class Solution {List<List<Integer>> arrayList = new ArrayList<>();List<Integer> list = new ArrayList<>();boolean[] visited;public List<List<Integer>> permute(int[] nums) {visited = new boolean[nums.length];backTracking(nums);return arrayList;}void backTracking(int[] nums) {if(list.size() == nums.length) {arrayList.add(new ArrayList(list));return;}for(int i = 0; i < nums.length; i++) {if(visited[i]) continue;visited[i] = true;list.add(nums[i]);backTracking(nums);visited[i] = false;list.remove(list.size()-1);}}}

这篇关于力扣爆刷第93天之hot100五连刷51-55的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/806021

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

力扣接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height