当前位置: 首页 > news >正文

力扣爆刷第153天之TOP100五连刷(接雨水、环形链表、最长上升子序列)

力扣爆刷第153天之TOP100五连刷(接雨水、环形链表、最长上升子序列)

文章目录

      • 力扣爆刷第153天之TOP100五连刷(接雨水、环形链表、最长上升子序列)
      • 一、300. 最长递增子序列
      • 二、415. 字符串相加
      • 三、143. 重排链表
      • 四、42. 接雨水
      • 五、142. 环形链表 II

一、300. 最长递增子序列

题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/description/
思路:求最长递增子序列,典型的动态规划题,定义dp数组表示,dp[i]为以nums[i]为结尾的区间中的最长递增子序列。那么对于dp[i]来说,区间中的每一个元素都有可能是最长递增子序列的一部分,对于每一个区间,从千往后遍历寻找。

class Solution {public int lengthOfLIS(int[] nums) {int[] dp = new int[nums.length];Arrays.fill(dp, 1);int max = 1;for(int i = 1; i < nums.length; i++) {for(int j = 0; j < i; j++) {if(nums[j] < nums[i]) {dp[i] = Math.max(dp[i], dp[j]+1);}}max = Math.max(dp[i], max);}return max;}
}

二、415. 字符串相加

题目链接:https://leetcode.cn/problems/add-strings/description/
思路:字符串相加这也是非常经典的题目,主要是边界条件的控制,利用 || 或条件不全为0的情况下,不会推出循环,来完成不等长字符串的相加,以及进位的相加。注意使用stringbuilder,添加完成后翻转。

class Solution {public String addStrings(String num1, String num2) {int i = num1.length() - 1, j = num2.length() - 1;int res = 0;StringBuilder sb = new StringBuilder();while(i >= 0 || j >= 0 || res != 0) {int a = i >= 0 ? num1.charAt(i) - '0' : 0;int b = j >= 0 ? num2.charAt(j) - '0' : 0;int sum = res + a + b;res = sum / 10;sb.append(sum % 10);i--;j--;}return sb.reverse().toString();}
}

三、143. 重排链表

题目链接:https://leetcode.cn/problems/reorder-list/description/
思路:题目要求如下重排,其实很简单,只需要找到链表中点,然后把中点后面的节点翻转,然后再逐个拼接。
如1 2 3 4 5,中点3, 后面翻转 5 4 ,然后得到了两个链表,1 2 3和 5 4 ,然后逐一拼接即可得到1 5 2 4 3.
在这里插入图片描述

在这里插入图片描述

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public void reorderList(ListNode head) {ListNode root = new ListNode(-1, head);ListNode slow = root, fast = root;while(fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}ListNode p = slow.next, pre = null;slow.next = null;while(p != null) {pre = p.next;p.next = slow.next;slow.next = p;p = pre;}fast = slow.next;slow.next = null;slow = head;while(fast != null) {ListNode t1 = slow.next;ListNode t2 = fast.next;slow.next = fast;fast.next = t1;slow = t1;fast = t2;}}
}

四、42. 接雨水

题目链接:https://leetcode.cn/problems/trapping-rain-water/description/
思路:接雨水,单调栈。只需要用单调栈构建出来一个凹槽即可,即当前元素小于等于栈顶元素即入栈,大于栈顶元素则出栈,出栈出来的就是凹槽的底部,当前元素是凹槽的右边,现在的栈顶是凹槽的左边,这样就可以计算凹槽的长和宽,进行面积计算。

class Solution {public int trap(int[] height) {LinkedList<Integer> stack = new LinkedList<>();int sum = 0;for(int i = 0; i < height.length; i++) {while(!stack.isEmpty() && height[i] > height[stack.peek()]) {int mid = height[stack.pop()];if(!stack.isEmpty()) {int w = i - stack.peek() - 1;int h = Math.min(height[i], height[stack.peek()]) - mid;sum += w * h;}}stack.push(i);}return sum;}
}

五、142. 环形链表 II

题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/
思路:求环形链表的入口也是一道经典的题目,快慢指针如果相遇则说明有环,然后两个指针一个从头结点出发,一个从相遇节点出发,再次相遇,即为环的入口。

public class Solution {public ListNode detectCycle(ListNode head) {ListNode slow = head, fast = head;while(fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;if(slow == fast) break;}if(fast == null || fast.next == null) return null;fast = slow;slow = head;while(fast != slow) {slow = slow.next;fast = fast.next;}return slow;}
}

相关文章:

  • Golang笔记:使用serial包进行串口通讯
  • STM32单片机-BKP和RTC
  • 如何级联移位寄存器(74HC595)
  • 【Linux】基础IO——文件描述符,重定向,FILE
  • WordPress 技巧:如何限制或取消自动清空回收站功能
  • 怎样去掉卷子上的答案并打印
  • mac下Xcode在iphone真机上测试运行iOS软件
  • [信号与系统]有关时域信号与频域信号的转换
  • 红队内网攻防渗透:内网渗透之内网对抗:隧道技术篇防火墙组策略FRPNPSChiselSocks代理端口映射C2上线
  • 力扣85.最大矩形
  • 【深度学习驱动流体力学】VTK创建、处理和可视化流体数据
  • 路由的params参数,命名路由,路由的params参数,命名路由
  • 架构师指南:现代 Datalake 参考架构
  • 深入理解Java虚拟机(JVM)中的垃圾回收器
  • VUE3 使用 vite-plugin-svg-icons加载SVG
  • 【译】JS基础算法脚本:字符串结尾
  • 《Java编程思想》读书笔记-对象导论
  • 2019年如何成为全栈工程师?
  • Django 博客开发教程 16 - 统计文章阅读量
  • ESLint简单操作
  • extract-text-webpack-plugin用法
  • Javascript设计模式学习之Observer(观察者)模式
  • JS+CSS实现数字滚动
  • python学习笔记-类对象的信息
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • vuex 学习笔记 01
  • 服务器从安装到部署全过程(二)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 算法-插入排序
  • 听说你叫Java(二)–Servlet请求
  • 我看到的前端
  • 数据可视化之下发图实践
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #LLM入门|Prompt#3.3_存储_Memory
  • $.ajax()
  • $.ajax,axios,fetch三种ajax请求的区别
  • (007)XHTML文档之标题——h1~h6
  • (Python第六天)文件处理
  • (ZT)薛涌:谈贫说富
  • (六)激光线扫描-三维重建
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三)docker:Dockerfile构建容器运行jar包
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)visual stdio 书签功能介绍
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net core 依赖注入的基本用发
  • .net MySql
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET技术成长路线架构图
  • .NET设计模式(11):组合模式(Composite Pattern)