
leetcode记录
文章平均质量分 57
Slay__
这个作者很懒,什么都没留下…
展开
-
leetcode记录 —— 组合+排序问题 —— 回溯+DFS+剪枝
46.全排列flag数组记录元素是否用过,然后dfs中将没用过的挨个加进去,继续DFS,后面移除本步加的。一个len控制返回,如果len等于数组长度证明所有排序完,返回。77.组合每次DFS缩小区间到当前元素后面的所有的,这样避免加入同样的元素,也避免出现排列看起来不同,组合其实一样的情况。len控制list中满足需要的个数退出。47.全排列II —— 包含重复元素,不能出现相同序列不能出现相同序列,与46区别是,同一层出现相同元素时,这整个子树都要剪掉,因为第一棵树已经有了。剪掉的方法是:对数组原创 2022-02-24 12:51:56 · 300 阅读 · 0 评论 -
leetcode记录-排序-215、347、451、75
Leetcode排序相关问题215.数组中第K大元素思路代码347.前K个高频元素思路代码451.根据字符出现频率排序思路代码75.颜色分类思路代码技巧总结排序相关思路元素出现个数统计HashMapList相关(二维List,Integer的List转数组)map操作(键集合、按键排序、某键值+1)字符List转String(Character数组同理)215.数组中第K大元素思路【最终位置】求数组中第K大元素,与排序相关,快排每次都能找到一个元素在排序好的数组中的最终位置(且左边的都比该数小,右边原创 2022-02-15 22:53:14 · 261 阅读 · 0 评论 -
leetcode记录-406-根据身高重建队列-贪心
406.根据身高重建队列思路因为此排序与两个元素有关,所以单纯的排序某个元素很难操作。而排序的规则,首先第一个元素同条件下,尽量大的在前面;第二个元素,同首元素下,需要小的在前面(因为前面是大于等于它的)。所以需要同时考虑两个元素的排序,而这种排序有特定的方法。排好序之后因为首元素大的在前面,所以从头开始,后面的元素其前面的都比自己大或者相等,这个个数就要对应尾元素的数字,此时存在有些首元素大的需要排到后面,当前数对直接放到所在下标即可,保证了前面都比自己大,也保证了个数。代码class Solu原创 2022-02-02 23:00:02 · 368 阅读 · 0 评论 -
leetcode记录-76-最小覆盖子串-双指针
76.最小覆盖子串思路错误思路记录:以t的长度作为初始区间长度,每个长度从头开始切子串,一直到末尾,因为从最小长度开始,如果找到满足条件的子串,即退出循环并return,找不到就区间长度加1,然后从头开始。对于“满足条件——统计子串中t中每个字符的个数”,写了统计String中某个字符出现个数的函数,对于子串中每个字符,如果其数目小于子串的数目,结束循环,区间步进。这种方法暴力搜索,时间复杂度太高,对于很长的字符串会报错——超出时间限制滑动窗口的本质是:在滑动窗口类型的问题中都会有两个指针,一个用原创 2022-02-05 22:12:58 · 465 阅读 · 0 评论 -
leetcode记录-88-合并两个有序数组-双指针
88.合并两个有序数组思路本题可以用sort排序,以及构建新数组一个一个遍历添加的方法,都太过简单不赘述。双指针疑虑:从后往前遍历添加元素,如果添加到数组1本来不为0的部分不好比较(放了之后把原来的位置置0),长度问题产生了疑虑。当array1的都添加到后面,循环判断需要注意。代码class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { //两个下标。一个总体下标,步进,从后往原创 2022-02-04 00:16:02 · 459 阅读 · 0 评论 -
leetcode记录-167-两数之和-双指针
167.两数之和思路如果本题没说递增数列,解法就是普通的O(n^2)的遍历。但是本题说了!!!递增数列,所以就要充分利用递增数列的特性,两数求和等于target,从首尾开始,不同情况移动不同的下标,直到找到,因为第一个数加最后一个数和最后一个数加第一个数没区别,所以中间汇聚即可,肯定能找到。代码如果不是递增数列的解法:①while循环:class Solution { public int[] twoSum(int[] numbers, int target) {原创 2022-02-03 22:47:47 · 388 阅读 · 0 评论 -
leetcode记录-665-非递减数列-贪心
655.非递减数列思路因为最多修改一个元素,变成非递减数列,所以只要找到一个比前一个i-1小的元素i,对其进行判断完之后,后面遇到此种情况就false。在判断的时候,因为部分下降要变成总体递增,所以不止和这两个元素有关,变化可以是把前面的减小,也可以是把后面的增大,但是原则是不破坏总体递增,因此这两种方式:①下降前面的i-1,需要i-2和i满足递增 ②提高后面的i,需要满足i-1和i+1满足递增。对于两边界也要考虑。代码class Solution { public boolean che原创 2022-02-03 21:24:11 · 489 阅读 · 0 评论 -
leetcode记录-763-划分字母区间-贪心
763.划分字母区间差点掉进坑的思路本来想记录每个字母出现的首下标和尾下标,得到一个有24个区间的数组。然后求这个区间数组的独立并集(只有相交才求并集,下次看相交跟并集比)数目,然后在找每个字母出现的首下标和尾下标的时候,企图遍历。。。。。。太夸张了。。。。。还好突然灵光一闪百度了String中某个字符出现的首下标和尾下标的方法,以及String获取某下标的字符的方法。。。。但是遍历得到数组然后再求独立并集数好像和直接求没啥区别,多此一举,因此有了下面的思路。思路两个标志:一个begin记录当前原创 2022-01-30 22:14:42 · 511 阅读 · 0 评论 -
leetcode记录-680-验证回文字符串Ⅱ-双指针
680.验证回文字符串Ⅱ思路因为最多删一个字符能否成为回文字符串,双指针从首尾开始朝中间步进,当l和r处的字符相同,同时步进;当不同时,如果字符串为满足题意的串,则其[l+1,r]或者[l,r-1]为回文串,这时判断要是满足这两个条件就返回true,否则不满足返回false。需要写一个判断回文串的函数。代码class Solution { public boolean validPalindrome(String s) { int l=0,r=s.length()-1;原创 2022-02-09 20:16:42 · 391 阅读 · 0 评论 -
leetcode记录-34-在排序数组中查找元素出现的第一个和最后一个位置-二分经典
34-在排序数组中查找元素出现的第一个和最后一个位置思路如果直接用二分法寻找区间比较困难,当找到target时又要向左又要向右不知道该如何处理 —— 问题转化为寻找target出现的第一个位置(左边界)和寻找target出现的最后一个位置(右边界)两个二分,在每次二分中,注意l和r的初始条件,while的条件,l和r如何变化(自己习惯左闭右闭的写法),在寻找左边界时,mid大于和小于的情况正常r=mid-1和l=mid+1,但是当找到target的下标index,需要看左边是否还有,所以要让r=mid原创 2022-02-08 22:06:01 · 444 阅读 · 0 评论