![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题
文章平均质量分 65
t1anist
Keep trying, keep exploring
展开
-
【每日三题】2022-4-4 LeetCode 40-42
40.组合总和II思路:与上一题类似,区别在于有重复数字,要考虑去重的情况。去重首先要排序,使重复数字排列在一块。当遇到重复数字时,将它作为一个组合,只可从左边开始选。当这个组合中的前一个数字没有被选择时,这个数字也不能选择。假设有【2,2,2】,我们的只尝试【】,【0】,【0,1】,【0,1,2】这几种情况,去除了【0,2】和【1,2】的情况,因为这两种情况与【0,1】的情况一样,都包含了两个2。递归过程中,若当前位置的元素被选中了,则考虑下一个元素要不要选(不管它是重复的还是不重复的),若当前位置的元原创 2022-04-05 10:51:10 · 764 阅读 · 0 评论 -
【每日三题】2022-4-3 LeetCode 37-39
37.解数独思路:回溯法。首先遍历数组,保存其中已有的数字信息,这些是不可变的。同时记录需要填写的格子。之后每次从需要填写的格子中拿出一个,尝试填写与现有其他格子不冲突的数字,更新状态,并递归尝试填写下一个格子。当所有格子填写完成时,则找到解。若填写下一个格子时,所有数字均冲突,则说明当前格子填写当前值时无解,继续寻找下一个可能的解。代码:private boolean[][] rows = new boolean[9][9];private boolean[][] cols = new boole原创 2022-04-04 06:48:45 · 659 阅读 · 0 评论 -
【每日三题】2022-4-2 LeetCode 34-36
34.在排序数组中查找元素的第一个和最后一个位置思路:二分查找。需要两次二分查找,分别找出第一个和最后一个位置。首先,通过二分查找找第一个的位置。判断nums[mid] == target。如果不等于,则说明第一个的位置在mid左侧或者右侧,根据其大小关系移动指针。如果等于,则进行下一步判断。如果mid = 0 || nums[mid - 1] != target,此时说明mid就是该元素第一次出现的位置。如果不满足条件,则说明当前位置等于目标但不是目标元素第一次出现,因此第一次出现会出现在mid左原创 2022-04-03 04:17:40 · 121 阅读 · 0 评论 -
【每日三题】2022-4-1 LeetCode 31-33
31.下一个排列思路:比当前排列更大的下一个字典序,只需要将一个较小数字,与其后面的一个较大数交换,然后从较小数的位置向后升序排列,已达到最小幅度变化。为使变化幅度最小,我们需要使得这个较小数尽可能靠右,同时要确保右侧有至少一个较大数与其交换,且这个较大数应该尽可能接近较小数。所以第一遍从后向前找,找到第一个从右向左非升序的数,这个时候可以确保其右侧有可以与之交换的较大数。如果找到头都没有找到符合的数,则说明当前的排列为最大字典序,则省去交换步骤,直接将其按升序排列得到最小字典序序列。找到较小数后,第二遍原创 2022-04-02 15:25:18 · 776 阅读 · 0 评论 -
【每日三题】2022-3-31 LeetCode 28-30
28.实现strStr()思路:逐个比对字符串,暴力求解,复杂度极大。从题解中了解KMP算法。具体实现可参考LeetCode官方题解。https://leetcode-cn.com/problems/implement-strstr/solution/shi-xian-strstr-by-leetcode-solution-ds6y/代码:public int strStr(String haystack, String needle) { if (needle.length() == 0)原创 2022-04-01 15:15:16 · 250 阅读 · 0 评论 -
【每日三题】2022-3-29 LeetCode 25-27
25.K个一组翻转链表思路:常规情况,使用栈遍历链表,每当栈中的元素等于K时,则翻转一次。因为栈是后进先出的,出栈顺序恰好与入栈顺序相反,可以轻易实现翻转。但这种思路,需要K的空间来存储链表结点,题目提出挑战使用常数空间来翻转,因此挑战使用常数空间。可以观察到每一次翻转,需要保存的主要有这个K元组的前一个结点和后一个结点,因此使用四个结点指针,其中一个保存前一个结点,另一个保存后一个结点,第三个指针和第四个指针用来在中间的k元组进行翻转用。以链表{1,2,3,4,5}, k = 3为例子,步骤如下:原创 2022-03-30 09:15:35 · 86 阅读 · 0 评论 -
【每日三题】2022-3-28 LeetCode 22-24
22.括号生成思路:一个包含n组括号的有效字符串,一定可以分为"(" + L + ")" + R,其中L和R为包含“0~n-1"对括号的有效字符串,因此考虑递归。这里为什么不将其简单的分为两部分L + R呢,是因为L和R都可能呢为0个括号的有效字符串,而递归需要缩小状态空间。若不每次分出一个括号,则L或R任一为空字符串(即包含0个括号的有效字符串)时,会陷入死循环。L+R中总共包含n-1个括号,每次手动添加一个括号。遍历各种情况。此时可采用缓存来保存之前的结果,因为之后会调用用到。代码:private原创 2022-03-29 08:14:49 · 95 阅读 · 0 评论 -
【每日三题】2022-3-27 LeetCode 19-21
19.删除链表的倒数第N个结点思路:快慢指针,两个指针之间相差n + 1个位置。当快指针到达链表末尾时,慢指针的下一个结点就是要删除的倒数第N个结点。考虑到删除头结点的情况,引入一个virtual head指针指向整个链表的头部。当快指针先行过程中遇到末尾,则说明链表长度<n,因此不存在倒数第N个结点。代码:public ListNode removeNthFromEnd(ListNode head, int n) { if (head == null) { return原创 2022-03-28 10:06:09 · 1142 阅读 · 0 评论 -
【每日三题】2022-3-25 LeetCode 16-18
16.最接近的三数之和思路:与15题类似,首先固定第一个数,使用双指针来扫描后面两个数的组合,跳过重复的数字。代码:public int threeSumClosest(int[] nums, int target) { int result = nums[0] + nums[1] + nums[2]; Arrays.sort(nums); for (int i = 0; i < nums.length - 2; i++) { if (i > 0 &原创 2022-03-26 14:48:01 · 167 阅读 · 0 评论 -
【每日三题】2022-3-24 LeetCode 13-15
13.罗马数字转整数思路:观察规律,除了特殊字符组合外,其他字符表示中,左边的字符均大于等于右边的字符。而当左边的字符小于右边的字符时,表明此时左边字符在整体结果中要被减去。因此建立字符集与值的映射,并遍历字符串,逐个转换。代码:public int romanToInt(String s) { if (s.equals("")) { return 0; } Map<Character, Integer> mapping = new HashMap&原创 2022-03-25 13:50:19 · 1039 阅读 · 0 评论 -
【每日三题】2022-3-23 LeetCode 10-12
10.正则表达式匹配思路:从前向后匹配(动态规划):状态空间大小为s.length() * p.length(),其中dp[i][j]代表s中的前i个字符和p中前j个字符匹配的结果。初始值为dp[0][0]=true,即两个空字符串匹配成功。状态转移方程如下:当j=0时,除了i=0的时候两串匹配外,其余情况均不匹配(意味着原串不为空,而匹配串匹配的是空串),dp[1~s.length()][0] = false。isMatch(String s, String p, int i, int原创 2022-03-24 15:09:45 · 119 阅读 · 0 评论 -
【每日三题】2022-3-22 LeetCode 7-9
7. 整数反转思路:利用取余10来提取最后一位,利用除以10来右移一位,将当前位加入到结果的最后一位。需要注意的是判断转换后的数有没有超过取值域。直接比较可能会越界,所以采用/10的方式比较。代码:public int reverse(int x) { int result = 0; while (x != 0) { int bit = x % 10; x /= 10; if (result > Integer.MAX_VALUE原创 2022-03-23 12:33:49 · 731 阅读 · 0 评论 -
【每日三题】2022-3-21 LeetCode 4-6
4. 寻找两个正序数组的中位数思路:暴力解法,merge两个数组并找中位数。实际我们可以省去merge过程,通过双指针模拟merge找到中位数。因为两个数组都是正序数组,所以从头开始遍历两个数组,将小的那一个去除,同时后移指针并减小计数。直至找到中间的数字。单数长度数组的中位数索引是length / 2,而双数长度数组的中位数索引是length / 2 - 1,与length / 2的两个数字的平均值。代码:public double findMedianSortedArrays(int[] nums原创 2022-03-23 12:32:30 · 1260 阅读 · 0 评论 -
【每日三题】2022-3-20 LeetCode 1-3
1. 两数之和思路:构造一个map来实现O(1)查找,key使用需要找到的另一半数字,value使用当前索引。遍历数组,如果map中包含nums[i],即又另一个数字与当前数字之和为target,则返回当前索引与另一个数字的索引。因为是从前往后查找,所以另一半一定是先遍历,索引较当前数字较小。如果map中不包含nums[i],则说明已经扫描的数字中没有当前数字的另一半,向map中存入当前数字所期望的另一半的值,与当前索引,继续向后搜索。如果遍历完成后,都没有符合条件的,则说明结果不存在。代码:publ原创 2022-03-23 12:31:46 · 1274 阅读 · 0 评论