leetcode-hot100刷题第六天

一、合并区间(leetcode-56)

问题描述

给出一个区间的集合,请合并所有重叠的区间。

示例

示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

解法分析

本题可以考虑贪心算法,先将原区间集合按照左端点升序排好序后,依次遍历,如果新遍历的区间的左端点小于末尾区间的右端点,则对末尾区间的右端点进行更新;
如果新遍历区间的左端点大于末尾区间的右端点,说明其不含交集,将其加入结果集中。

代码实现

	public static int[][] merge(int[][] intervals) {
		int len = intervals.length;
		if(len < 2) {
			return intervals;
		}
		//按照左端点升序排序
		Arrays.sort(intervals,Comparator.comparingInt(o -> o[0]));
		
		//创建list用于保存合并后的结果
		List<int []> res = new ArrayList<int[]>();
		res.add(intervals[0]);
		
		for(int i = 1 ; i < len ; i++) {
			int [] temp = intervals[i];
			
			//每次新遍历的列表与当前结果集中最后一个区间的末尾节点进行比较
			int [] peek = res.get(res.size()-1);
			
			if(temp[0] > peek[1]) {
				res.add(temp);
			}else {
				peek[1] = Math.max(temp[1], peek[1]);
			}
		}
		return res.toArray(new int[res.size()][]);
    }

二、不同路径(leetcode-62)

问题描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?

示例

示例 1:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右

示例 2:
输入: m = 7, n = 3
输出: 28

提示:
1 <= m, n <= 100
题目数据保证答案小于等于 2 * 10 ^ 9

解法分析

本题目是一个典型的动态规划问题,对于当前位置dp[i][j],可能是从dp[i][j-1]向下走一步到达,也可能是从dp[i-1][j]向右走一步到达。

代码实现

	public int uniquePaths(int m, int n) {

        int [][] dp = new int [m][n];

        dp[0][0] = 1;
        for(int i = 1 ; i < m ;i++){
            dp[i][0] = 1;
        }
        for(int j = 1 ; j < n ; j++){
            dp[0][j] = 1;
        }

        for(int x = 1 ; x < m ;x++){
            for(int y = 1 ; y < n ; y++){
                dp[x][y] = dp[x-1][y] + dp[x][y-1];
            }
        }

        return dp[m-1][n-1];
    }

三、最小路径和(leetcode-64)

问题描述

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。

示例

示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

解法分析

本题相当于上一道题目的进阶版,也可以用动态规划的方法求出起点到dp[i][j]位置最小路径和,最后返回dp[m-1][n-1]即可。

代码实现

	public static int minPathSum(int[][] grid) {
		int m = grid.length;
		int n = grid[0].length;
		
		//状态定义
		int [][] dp = new int[m][n];
		
		//状态初始化
		dp[0][0] = grid[0][0];
		for(int i = 1 ; i < m ; i++) {
			dp[i][0] = dp[i-1][0] + grid[i][0];
		}
		for(int j = 1 ; j < n ; j++) {
			dp[0][j] = dp[0][j-1] + grid[0][j];
		}
		
		//状态转移
		for(int i=1 ; i < m ;i++) {
			for(int j = 1 ; j < n ;j++) {
				dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
			}
		}
		
		return dp[m-1][n-1];
	}

四、爬楼梯(leetcode-70)

问题描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。

示例

示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

解法分析

本题也是一个典型的动态规划问题,dp[i]为到第i级台阶的走法,dp[i] = dp[i-1]+dp[i-2],结果返回dp[n-1]即可。用递归做也比较简单。

代码实现

	public int climbStairs(int n) {
        if(n <= 2){
            return n;
        }
        //1、状态定义
		//dp[i]表示爬到第i+1层台阶有几种爬法
		int [] dp = new int [n];
		
		//2、状态初始化
		//第一层台阶有一种爬法,第二层台阶有两种爬法
		dp[0] = 1;
		dp[1] = 2;
		
		//3、状态转移方程
		//dp[i] = dp[i-1] + dp[i-2]
		for(int i = 2 ; i < n ; i++) {
			dp[i] = dp[i-1] + dp[i-2];
		}
		return dp[n-1];
    }

五、编辑距离(leetcode-72)

问题描述

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符

示例

示例 1:
输入:word1 = “horse”, word2 = “ros”
输出:3
解释:
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)

示例 2:
输入:word1 = “intention”, word2 = “execution”
输出:5
解释:
intention -> inention (删除 ‘t’)
inention -> enention (将 ‘i’ 替换为 ‘e’)
enention -> exention (将 ‘n’ 替换为 ‘x’)
exention -> exection (将 ‘n’ 替换为 ‘c’)
exection -> execution (插入 ‘u’)

解法分析

首先我们需要对单词修改的操作进行分析,其实本质的操作方式只有三种:1、在A中插入一个字符;2、在B中插入一个字符;3、修改A中一个字符。
本题依旧可以使用动态规划求解,dp[i][j]表示word1前i个字符和word2前j个字符的最小编辑距离,则其可以由dp[i-1][j-1]、dp[i-1][j]和dp[i][j-1]比较求得。

代码实现

	public static int minDistance(String word1, String word2) {
		int m = word1.length();
	    int n = word2.length();

	    // 有一个字符串为空串
	    if (n * m == 0)
	      return n + m;

	    // DP 数组
	    int [][] D = new int[m + 1][n + 1];

	    // 边界状态初始化
	    for (int i = 0; i < m + 1; i++) {
	      D[i][0] = i;
	    }
	    for (int j = 0; j < n + 1; j++) {
	      D[0][j] = j;
	    }

	    // 计算所有 DP 值
	    for (int i = 1; i < m + 1; i++) {
	      for (int j = 1; j < n + 1; j++) {
	        int left = D[i - 1][j] + 1;
	        int down = D[i][j - 1] + 1;
	        int left_down = D[i - 1][j - 1];
	        if (word1.charAt(i - 1) != word2.charAt(j - 1))
	          left_down += 1;
	        D[i][j] = Math.min(left, Math.min(down, left_down));

	      }
	    }
	    return D[m][n];
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com
1. Two Sum 2. Add Two Numbers 3. Longest Substring Without Repeating Characters 4. Median of Two Sorted Arrays 5. Longest Palindromic Substring 6. ZigZag Conversion 7. Reverse Integer 8. String to Integer (atoi) 9. Palindrome Number 10. Regular Expression Matching 11. Container With Most Water 12. Integer to Roman 13. Roman to Integer 14. Longest Common Prefix 15. 3Sum 16. 3Sum Closest 17. Letter Combinations of a Phone Number 18. 4Sum 19. Remove Nth Node From End of List 20. Valid Parentheses 21. Merge Two Sorted Lists 22. Generate Parentheses 23. Swap Nodes in Pairs 24. Reverse Nodes in k-Group 25. Remove Duplicates from Sorted Array 26. Remove Element 27. Implement strStr() 28. Divide Two Integers 29. Substring with Concatenation of All Words 30. Next Permutation 31. Longest Valid Parentheses 32. Search in Rotated Sorted Array 33. Search for a Range 34. Find First and Last Position of Element in Sorted Array 35. Valid Sudoku 36. Sudoku Solver 37. Count and Say 38. Combination Sum 39. Combination Sum II 40. First Missing Positive 41. Trapping Rain Water 42. Jump Game 43. Merge Intervals 44. Insert Interval 45. Unique Paths 46. Minimum Path Sum 47. Climbing Stairs 48. Permutations 49. Permutations II 50. Rotate Image 51. Group Anagrams 52. Pow(x, n) 53. Maximum Subarray 54. Spiral Matrix 55. Jump Game II 56. Merge k Sorted Lists 57. Insertion Sort List 58. Sort List 59. Largest Rectangle in Histogram 60. Valid Number 61. Word Search 62. Minimum Window Substring 63. Unique Binary Search Trees 64. Unique Binary Search Trees II 65. Interleaving String 66. Maximum Product Subarray 67. Binary Tree Inorder Traversal 68. Binary Tree Preorder Traversal 69. Binary Tree Postorder Traversal 70. Flatten Binary Tree to Linked List 71. Construct Binary Tree from Preorder and Inorder Traversal 72. Construct Binary Tree from Inorder and Postorder Traversal 73. Binary Tree Level Order Traversal 74. Binary Tree Zigzag Level Order Traversal 75. Convert Sorted Array to Binary Search Tree 76. Convert Sorted List to Binary Search Tree 77. Recover Binary Search Tree 78. Sum Root to Leaf Numbers 79. Path Sum 80. Path Sum II 81. Binary Tree Maximum Path Sum 82. Populating Next Right Pointers in Each Node 83. Populating Next Right Pointers in Each Node II 84. Reverse Linked List 85. Reverse Linked List II 86. Partition List 87. Rotate List 88. Remove Duplicates from Sorted List 89. Remove Duplicates from Sorted List II 90. Intersection of Two Linked Lists 91. Linked List Cycle 92. Linked List Cycle II 93. Reorder List 94. Binary Tree Upside Down 95. Binary Tree Right Side View 96. Palindrome Linked List 97. Convert Binary Search Tree to Sorted Doubly Linked List 98. Lowest Common Ancestor of a Binary Tree 99. Lowest Common Ancestor of a Binary Search Tree 100. Binary Tree Level Order Traversal II

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值