LeetCode 56. 合并区间
56. 合并区间题目以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 1:
123输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
123输入:intervals = [[1,4],[4,5]]输出:[[1,5]]解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
1231 <= intervals.length <= 104intervals[i].length == 20 <= starti <= endi <= 104
思路先对数组进行排序,保证数组中的子数组是按照intervals[][0]进行排序的,排序后的数组是否能够合并分为下面两个结果
不能够合并,前一个合并后的right&l ...
LeetCode 567. 字符串的排列
567. 字符串的排列题目给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
示例 1:
123输入:s1 = "ab" s2 = "eidbaooo"输出:true解释:s2 包含 s1 的排列之一 ("ba").
示例 2:
12输入:s1= "ab" s2 = "eidboaoo"输出:false
提示:
121 <= s1.length, s2.length <= 104s1 和 s2 仅包含小写字母
思路使用滑动窗口
实现
62. 不同路径
62. 不同路径题目
123456789101112131415161718192021222324252627282930313233一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右3. 向下 -> 向右 -> 向下示例 3:输入:m = 7, n = 3输出:28示例 4:输入:m = 3, n = 3输出:6 提示:1 <= m, n <= 100题目数据保证答案小于等于 2 * 109
思路首先想到的就是动态规划,寻找最小子问题,找最优子结构,找状态转移方程
还是二维数组,找路径
状态转移方程:
1memo[i][j] = memo[i - 1] ...
LeetCode 69. Sqrt(x)
69. Sqrt(x)题目给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4输出:2示例 2:
输入:x = 8输出:2解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 231 - 1
思路
使用二分法尝试法,对x进行二分,mid的平方小于x则,left=mid,否则right=mid
牛顿迭代法
实现二分法牛顿迭代法
LeetCode 300. 最长递增子序列
300. 最长递增子序列题目给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例 1:
123输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:
12输入:nums = [0,1,0,3,2,3]输出:4
示例 3:
12输入:nums = [7,7,7,7,7,7,7]输出:1
提示:
1 <= nums.length <= 2500-104 <= nums[i] <= 104
进阶:
你可以设计时间复杂度为 O(n2) 的解决方案吗?你能将算法的时间复杂度降低到 O(n log(n)) 吗?
思路O(n2) 这个一看就是动态规划,对动态太规划算法的进一步优化就是贪心
实现动态规划后面这个结果依赖于前面结果的最大值,寻找j的结果的时候,我们从0开始遍历,挨个对比如果是递增的就加一, ...
LeetCode 31. 下一个排列
31. 下一个排列题目实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例 1:
输入:nums = [1,2,3]输出:[1,3,2]示例 2:
输入:nums = [3,2,1]输出:[1,2,3]示例 3:
输入:nums = [1,1,5]输出:[1,5,1]示例 4:
输入:nums = [1]输出:[1]
提示:
1 <= nums.length <= 1000 <= nums[i] <= 100
思路以排列 [4,5,2,6,3,1] 为例:
假如我们要找到它的最小排列的最小思路是什么:
大数在前面,后面的大数替换前面的一个小数
我们要替换的小数要尽可能的靠近末尾的位置
所以我们要把这个数变为453621,但是我们发现这个数也不是临近的的数,我们需要把3只有的数变为一个最小值,也就是453126
所以整体思路也就出来了,我们使用两次循环
第一次循环从后向前找 ...
387.字符串中的第一个唯一字符
387. 字符串中的第一个唯一字符题目12345678910111213给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = "leetcode"返回 0s = "loveleetcode"返回 2 提示:你可以假定该字符串只包含小写字母。
思路实现123456789101112131415private static class Solution { public int firstUniqChar(String s) { int[] bucket = new int[26]; for (int i = 0; i < s.length(); i++) { bucket[s.charAt(i) - 'a']++; } for (int i = 0; i < s.length(); i++) { if (bucket ...
LeetCode 33. 搜索旋转排序数组
33. 搜索旋转排序数组题目整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
示例 1:
12输入:nums = [4,5,6,7,0,1,2], target = 0输出:4
示例 2:
12输入:nums = [4,5,6,7,0,1,2], target = 3输出:-1
示例 3:
12输入:nums = [1], target = 0输出:-1
提示:
123451 <= nums.length <= 50 ...
322.零钱兑换
322. 零钱兑换题目1234567891011121314151617181920212223242526272829303132333435给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3 解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-1示例 3:输入:coins = [1], amount = 0输出:0示例 4:输入:coins = [1], amount = 1输出:1示例 5:输入:coins = [1], amount = 2输出:2 提示:1 <= coins.length <= 121 <= coins[i] <= 231 - 10 <= amount <= 104
思路首先就是使用递归,但是递归也是分情况的
...
LeetCode 4. 寻找两个正序数组的中位数
4. 寻找两个正序数组的中位数题目给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:
输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5示例 3:
输入:nums1 = [0,0], nums2 = [0,0]输出:0.00000示例 4:
输入:nums1 = [], nums2 = [1]输出:1.00000示例 5:
输入:nums1 = [2], nums2 = []输出:2.00000
提示:
nums1.length == mnums2.length == n0 <= m <= 10000 <= n <= 10001 <= m + n <= 2000 ...
LeetCode 415. 字符串相加
415. 字符串相加题目给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
12输入:num1 = "11", num2 = "123"输出:"134"
示例 2:
12输入:num1 = "456", num2 = "77"输出:"533"
示例 3:
12输入:num1 = "0", num2 = "0"输出:"0"
1234提示:1 <= num1.length, num2.length <= 104num1 和num2 都只包含数字 0-9num1 和num2 都不包含任何前导零
思路就是模拟加法,如果大于10进行取模,结果都保存到字符串中,最后反转字符串
实现123456789101112131415161718 ...
LeetCode 42. 接雨水
42. 接雨水题目给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
123输入: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:
12输入:height = [4,2,0,3,2,5]输出:9
提示:
n == height.length1 <= n <= 2 * 1040 <= height[i] <= 105
思路动态规划,定义数组,先从左边找到这个数组中的最大值,然后从右边找到数组中的最大值
双指针:为们动态规划的时候发现我们的雨水的值依赖于从左边和右边的最大值,减去原来的数组,所以我们可以使用双指针代理这个两个数组,从而动态的拿到雨水的值
实现动态规划:
12345678910111213141516171819202122232425262728private static class Solut ...
LeetCode 25. K 个一组翻转链表
25. K 个一组翻转链表题目给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
12输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]
示例 2:
12输入:head = [1,2,3,4,5], k = 3输出:[3,2,1,4,5]
示例 3:
12输入:head = [1,2,3,4,5], k = 1输出:[1,2,3,4,5]
示例 4:
12输入:head = [1], k = 1输出:[1]
123456提示:列表中节点的数量在范围 sz 内1 <= sz <= 50000 <= Node.val <= 10001 <= k <= sz
思路每k个节点进行一次划分,这个内部是一个翻转链表,我们需要记录链表的start和e ...
LeetCode 3. 无重复字符的最长子串
3. 无重复字符的最长子串题目给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
123输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
123输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
1234输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
12输入: s = ""输出: 0
123提示:0 <= s.length <= 5 * 104s 由英文字母、数字、符号和空格组成
思路滑动窗口,使用一个map保存字符k,value为出现的位置,使用双指针,如果没有重复右指针一直向 ...
LeetCode 2. 两数相加
2. 两数相加题目给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:
输入:l1 = [0], l2 = [0]输出:[0]示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内0 <= Node.val <= 9题目数据保证列表表示的数字不含前导零
思路我们可以使用一次遍历,使用一个int存储进位,第二个值需要加上上一个进位
实现1234567891011121314151617181920public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ...