随笔分类 -  算法

刷题力扣
摘要:思路,要的是顺时针旋转九十度。 1.按照主对角线,做个对称。 [[1,2,3],[4,5,6],[7,8,9]] 变成:[[1,4,7],[2,5,8],[3,6,9]],这一步用二层循环就行了,n*n的矩阵,所以m.length==m[0].length,用哪个都行 2,竖着,左右两半来个轴对称, 阅读全文
posted @ 2020-04-28 10:13 弓呆的胖次 阅读(164) 评论(0) 推荐(0)
摘要:看到时间复杂度要求:O(logn),就知道是折半查找,很简单,先折半查找target的下标,之后向左右找nums[left],nums[right]等于target的下标,返回就行。 class Solution { public int[] searchRange(int[] nums, int 阅读全文
posted @ 2020-04-28 09:31 弓呆的胖次 阅读(608) 评论(0) 推荐(0)
摘要:思路:很简单,两个指针cur1,cur2分别指向l1,l2,当cur1,cur2都不空时,比较两个指针指向的节点的数值,把小的那个接到结果res上,之后这个cur1/cur2后移 当这个循环结束后,有可能剩下一个没被遍历到的链表(因为两个链表长度可能不一样),所有再写俩循环就行。 class Sol 阅读全文
posted @ 2020-04-28 08:39 弓呆的胖次 阅读(116) 评论(0) 推荐(0)
摘要:可以利用replaceAll()函数实现目的,介绍可以看下面两个网址 https://www.runoob.com/java/java-string-replaceall.html https://www.cnblogs.com/lzh1043060917/p/12791689.html 把完整的括 阅读全文
posted @ 2020-04-28 08:20 弓呆的胖次 阅读(144) 评论(0) 推荐(0)
摘要:一个位置是否能接雨水,取决于这个下标a的左右两侧,是否存在比a的高度更高的下标。所以找到当前元素a能存多少水,步骤分两步 1.找到每个元素(头尾元素不算)左侧高度最高的下标L。和每个元素右侧高度最高的下标R。 2.找L与R的高度的最小值,假设左边更低 3.nums[L]如果大于nums[a],可以存 阅读全文
posted @ 2020-04-24 15:40 弓呆的胖次 阅读(131) 评论(0) 推荐(0)
摘要:时间复杂度可以满足,常数级别额外空间弄不出来。。。。 可以使用HashSet,因为找的是没排序的最小正整数,所以这样就行,先把每一个元素都add进HashSet,之后,从1开始,遍历1到nums.length+1的所有数字,如果这个数字i不在set里面,就说明缺这个数字。用Set。。。好像是怕有重复 阅读全文
posted @ 2020-04-24 15:17 弓呆的胖次 阅读(108) 评论(0) 推荐(0)
摘要:题目: 与上一题的不同: 1.在上一个“组合总和”中,每个元素可选择无数次,这个题里面,一个元素只能选一次。 2. 上一个题里,元素都不重复,这个题,元素可重复。 思路:和上一题差不多,回朔法。先排序。假如给出的数1,2,2,2。target==5;因为每个数只能选一次,所以要有一个数组visite 阅读全文
posted @ 2020-04-24 14:49 弓呆的胖次 阅读(115) 评论(0) 推荐(0)
摘要:思路: 思路:根据示例 1:输入: candidates = [2,3,6,7],target = 7。 候选数组里有 2 ,如果找到了 7 - 2 = 5 的所有组合,再在之前加上 2 ,就是 7 的所有组合;同理考虑 3,如果找到了 7 - 3 = 4 的所有组合,再在之前加上 3 ,就是 7 阅读全文
posted @ 2020-04-23 16:21 弓呆的胖次 阅读(211) 评论(0) 推荐(0)
摘要:class Solution { public String countAndSay(int n) { String str,res;//res是对前一项的描述 就是结果,每个数的描述都是从“”生产的,所以要一个str记录一下上一个对前一项的描述 res="1"; for(int i=1;i<n;i 阅读全文
posted @ 2020-04-23 15:59 弓呆的胖次 阅读(113) 评论(0) 推荐(0)
摘要:假如链表长度为5,有1,2,3,4,5五个元素,删除倒数第2个元素4。5-2=3,也就是指向被删除的元素的上一个元素,正好。 正确做法:多次循环: class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { Li 阅读全文
posted @ 2020-04-23 11:40 弓呆的胖次 阅读(148) 评论(0) 推荐(0)
摘要:和三数之和太像了,无非是多了一个循环,求1,2,3,4个数的和等于target的所有不重复集合。第3,4个数那里还可以用双指针法 不同点:先排序,这里和三数之和一样,这里可以加入当前最小值,最大值的判断,减少运算次数,如果当前最小值大于target直接break,因为随着指针右移,四数之和只会越来越 阅读全文
posted @ 2020-04-22 16:22 弓呆的胖次 阅读(189) 评论(0) 推荐(0)
摘要:可以看出,假如输入的有两个数字,得用两层循环得出结果。假如输入三个数字,就得是三层循环。可以用递归 class Solution {//递归, public List<String> letterCombinations(String digits) { List<String> list = ne 阅读全文
posted @ 2020-04-22 16:08 弓呆的胖次 阅读(272) 评论(0) 推荐(0)
摘要:给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三 阅读全文
posted @ 2020-04-22 15:20 弓呆的胖次 阅读(152) 评论(0) 推荐(0)
摘要:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: 阅读全文
posted @ 2020-04-22 09:23 弓呆的胖次 阅读(165) 评论(0) 推荐(0)
摘要:class Solution { public int[] plusOne(int[] digits) {//因为是加一,所以进位只可能是1 int length=digits.length; for(int i=length-1;i>=0;i--) { if(digits[i]!=9)//如果当前 阅读全文
posted @ 2020-04-21 15:44 弓呆的胖次 阅读(136) 评论(0) 推荐(0)
摘要:方法: 这题的做法大概是这样: 去掉前导空格 再是处理正负号 识别数字,注意越界情况。 这道题目如果只是简单地字符串转整数的话,就是简单地rev=rev*10+pop。 但是注意这道题目可能会超过integer的最大表示! 也就是说会在某一步(1)rev*10+pop> Integer.MAX_VA 阅读全文
posted @ 2020-04-21 11:30 弓呆的胖次 阅读(142) 评论(0) 推荐(0)
摘要:思路: 1.首先要有一个列表rows存储所有的数据,列表里每一个元素代表题中的一行,每一行里面的元素都是不断往里面加进去的,不是初始化好的。所以列表的每个元素,也就是每一行,应该用StringBuilder。按照题意rows总共numRows行,下标是0到numRows-1 2.其次,在边界处如何处 阅读全文
posted @ 2020-04-21 09:03 弓呆的胖次 阅读(245) 评论(0) 推荐(0)
摘要:思路:暴力法的改进 class Solution { public String longestPalindrome(String s) { if(s==null||s.length()==0)return s ; int length=s.length(); boolean[][] P=new b 阅读全文
posted @ 2020-04-20 16:58 弓呆的胖次 阅读(112) 评论(0) 推荐(0)
摘要:题目内容: 题目解析:也就是说,用一个数组来表示一个数,数组最右边是个位。找到大于这个数的另一个数b,这个数b不仅要大于给出的数,还要尽可能小。 方法: 1.题目是找出大于当前数的最小的那个数。假如从左到右,数字按降序走,则一定不可能有更大的数。因为从左到右降序的话,数字一定是最大的。2.所以说,应 阅读全文
posted @ 2020-04-20 11:11 弓呆的胖次 阅读(128) 评论(0) 推荐(0)
摘要:内容: 解法这样,首先肯定得排序, 算法流程:特判,对于数组长度 nn,如果数组为 nullnull 或者数组长度小于 33,返回 [][]。对数组进行排序。遍历排序后数组:若 nums[i]>0nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 00,直接返回结果。对于重复元素:跳 阅读全文
posted @ 2020-04-08 17:08 弓呆的胖次 阅读(412) 评论(0) 推荐(0)