随笔分类 - 迭代法
摘要:采用模拟的方案顺时针遍历所有元素 时间O(m*n)(需要遍历所有节点),空间O(1) 1 public List<Integer> spiralOrder(int[][] matrix) { 2 LinkedList<Integer> res = new LinkedList<>(); 3 if(m
阅读全文
摘要:基于s的范围暴力破解的话必然超时 这里采用滑动窗口的方案来处理 我们维护一个队列,依次将字符压入队列,当新遇到的字符 已经在队列中时,我们就需要将队列中已出现的位置前的字符全部弹出 来保证队列中永远不存在重复字符,同时每次队列更新后计算队列长度即可。 时间O(n),空间O(z)(与字符串s的离散度相
阅读全文
摘要:三步走方案 第一步:原链表基础上每个节点后新建一个完全一致的辅助节点,例如1->2->3, 调整后为1->1^->2->2^->3->3^ 第二步:将辅助节点的random节点赋值为原节点random的next,比较绕口,这里举个例子 比如原节点1的random节点为3,此时1^的random也是3
阅读全文
摘要:方法一、DP 假设dp[i][j]表示从i到j下标是否是回文串 于是有dp[i][j]=dp[i+1][j-1]^(s[i]==s[j]) 时间O(n^2),空间O(n^2) 1 public String longestPalindrome(String s) { 2 int len = s.le
阅读全文
摘要:题目要求s需要是t的子序列,子序列的定义是t中删除一些元素能够与s保持一致。 类似的题目有求2个字符串的最长公共子序列,经典的DP题。 不过本题我们可以偷懒使用双指针来处理,可以把题目简化为 s中的每一个字符是否都能在t中找到对应 时间O(m+n)(m、n分别为字符串s和t的长度),空间O(1) 1
阅读全文
摘要:题目要求替换掉全部的?字符,需要考虑到特殊字符出现在 头尾的边界情况。遍历字符串的所有元素,针对特殊字符,我们获取 当前位置的前后一个元素,然后从a开始递推,得到不与前后元素 相同的第一个元素即可。 1 public String modifyString(String s) { 2 char[]
阅读全文
摘要:双指针+递归来处理 题目要求只删除一个元素,我们可以使用双指针一次比较头尾字符,遇到 不一致的字符做删除操作,这里就出现了2种方案,删除左侧字符还是右侧字符 于是我们递归来处理这2种情况。同时使用全局变量记录删除元素数,当大于1时 即可判定为false 时间O(n),空间O(1)(注意,这里虽然存在
阅读全文
摘要:利用快慢指针来处理 时间O(n),空间O(1) 1 public ListNode middleNode(ListNode head) { 2 if(head==null || head.next==null) return head; 3 ListNode slow=head,fast=head.
阅读全文
摘要:参考 268. 丢失的数字 ,题目要求2边的和相同,我们可以首计算出总的和, 然后再遍历一遍,计算出已扫描过的区间和,再与两数相减的和比较即可。 时间O(n),空间O(1) 1 public int pivotIndex(int[] nums) { 2 long sum=0; 3 for(int n
阅读全文
摘要:第一反应是用Map建立哈希映射来比对对应关系,知道看到大佬的题解 根据题意,字符串中相同的字符必然对应同一个映射 时间O(n)(这里的n其实并不准确,因为indexOf内部是使用的暴力的方法去查找),空间O(1) 1 public boolean isIsomorphic(String s, Str
阅读全文
摘要:时间O(n),空间O(1) 1 public int[] plusOne(int[] digits) { 2 int len=digits.length,tag=1; 3 for(int i=len-1;i>=0;i--){ 4 tag=digits[i]+tag; 5 digits[i]=tag%
阅读全文
摘要:三个数相乘的最大值,有2种可能,(1)3个最大的正数(2)2个最小的负数和1个最大的正数。 方法一:先排序,排序后最小的负数和最大的正数位置就是确定的了 (1)必然是nums[n-3],nums[n-2],nums[n-1] (2)必然是nums[0],nums[1],nums[n-1] 时间O(n
阅读全文
摘要:本题的难点在于存在负数,我们知道非负数的平方数排序规则一定与 原数组顺序相同,但这里存在负数,导致无法直接确定 方法一:先计算出所有数的平方,然后排序 时间O(nlogn)(排序所用时间),空间O(logn)(排序所申请栈空间与深度有关,这里忽略了返回要求数组的空间) 1 class Solutio
阅读全文
摘要:利用哈希映射的思路来处理,记录子串在父串中每个字符出现的位置 时间O(nk)(k与父串中相应字符出现离散度有关,最差情况下k=m,即父串的长度),空间O(h)(h为字串离散度,本题为26) public boolean canConstruct(String ransomNote, String m
阅读全文
摘要:方法一:使用set来存储2个数组的元素 时间O(m+n),空间O(m+n) public int[] intersection(int[] nums1, int[] nums2) { if (nums1==null || nums2==null || nums1.length==0 || nums2
阅读全文
摘要:原谅我是个数学渣渣,幸好有甜姨的解析,结论就是迭代所得的数字必然是收敛的 由此便得到了2种可能情况 (1) 收敛为1 (2) 迭代结果出现环,无法收敛 看到这两个图其实我们就想到了之前做的题目,判断链表是否存在环,用的办法是佛洛依德算法,快慢指针判断, 于是我们这里也可以用快慢指针来实现 class
阅读全文
摘要:简单迭代即可 时间O(n),空间O(1) public int removeElement(int[] nums, int val) { int index=0; for(int num:nums){ // 遇到不相等元素则直接向数组内插入 if(num!=val){ nums[index++]=n
阅读全文
摘要:排序,然后比较开始结束时间即可 时间O(nlogn)(主要消耗在排序上),空间O(1) public boolean canAttendMeetings(int[][] intervals) { Arrays.sort(intervals, new Comparator<int[]>() { pub
阅读全文
摘要:这题和之前的268. 丢失的数字 、136. 只出现一次的数字 、387. 字符串中的第一个唯一字符 有类似又有不同的地方 由于本题中的数组元素存在相同元素,有的出现2次,有的出现1次,所以不能使用异或来直接得出结果。 于是我们想到使用哈希表来构建映射关系,参考387题。 但是题目提出了进一步的要求
阅读全文
摘要:老题目了,使用迭代可解(不建议用递归,会产生较多冗余计算) 时间O(n),空间O(1) public int fib(int n) { if (n<2) return n; int i=0,j=1,count=2; while(count<=n){ int temp = j; j=i+j; i=te
阅读全文

浙公网安备 33010602011771号