随笔分类 - 每日AC
包括leetcode以及java各类问题的探索
摘要:这道题可以用贪心算法和动态规划来解,贪心算法思路:先按照每个数组最右值大小排序,我们需要尽量找右边值最小数组作为保留的数组(这样可以留下更多数组),然后在将当前数组的右值和下一个数组的最左值比较。如果合适则加入。动态规划的思路:找以每个区间作为结尾的最大区间数。 public int eraseOv
阅读全文
摘要:这道题可以直接暴力法解出答案,但是如果对时间有要求,可以对每一行使用二分进行查找。 public boolean searchMatrix(int[][] matrix, int target) { for (int[] row : matrix) { int index = search(row,
阅读全文
摘要:这道题最初没有什么思路,所以算是按暴力来求解,将数组分层,一圈一圈的循环计算,从外圈到内圈。 public int[][] generateMatrix(int n) { int level=n%2==0?n/2:n/2+1; int temp=1; int [][] res=new int [n]
阅读全文
摘要:这道题属于Easy题,要求到目标行数,只需要一直递归上一行的内容即可。 public List<Integer> getRow(int rowIndex) { List<Integer> res=new LinkedList<>(); if(rowIndex==0) { res.add(1); re
阅读全文
摘要:这道题如果不考虑进阶方法,可以很轻松的使用排序直接得到答案: public void sortColors(int[] nums) { Arrays.sort(nums); } 但如果需要按照进阶的要求,不允许使用自带排序并要求一次遍历,我们可以用双指针进行求解。我们通过两个指针,pre0和pre1
阅读全文
摘要:最简单的方法就是:直接排序然后取中间的值,两行搞定 public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; }
阅读全文
摘要:这题如果用一般数据结构来解决,存在很多种解法,比如:通过hashmap记录出现的次数,最后遍历得到次数为1的数。或者通过hashset添加数字,如果无法添加就删除该数字。 public int singleNumber(int[] nums) { Set<Integer> hset=new Hash
阅读全文
摘要:我们可以知道前一排的数字可以直接影响到后一排的取值,且从第一排开始后,之后的首尾都是1.所以如果暴力的话,也可以直接得到正确结果。 public List<List<Integer>> generate(int numRows) { List<List<Integer>> res=new Linke
阅读全文
摘要:对于一个二维数组映射成另一个二维数组,我们可以将二维数组先映射成一个一维数组,然后再将一维数组逐个转为二维数组。 public int[][] matrixReshape(int[][] mat, int r, int c) { int m = mat.length; int n = mat[0].
阅读全文
摘要:该题在两个数组排序后使用双指针求解。 public int[] intersect(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); int i=0,j=0; List<Integer> res=new Linke
阅读全文
摘要:该题较为简单,合并排序即可。 public void merge(int[] nums1, int m, int[] nums2, int n) { List<Integer> res=new ArrayList<>(); for(int i=0;i<m;i++) res.add(nums1[i])
阅读全文
摘要:我们可以创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。 public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> hs=new
阅读全文
摘要:动态规划:每次算出以i结尾的连续子串的最大值,之后对dp[i]进行比较就可以得到最长子串。 public int maxSubArray(int[] nums) { int [] dp=new int [nums.length]; int max=nums[0]; dp[0]=nums[0]; fo
阅读全文
摘要:法一: 简单的做法就是先排序,再遍历整个数组寻找是否有相同元素。 public boolean containsDuplicate(int[] nums) { Arrays.sort(nums); for(int i=0;i<nums.length-1;i++) { if(nums[i+1]!=nu
阅读全文
摘要:找到环的起点需要做一些不同于快慢指针的处理,我们可以在快慢指针第一次相遇后,将其中一个指针再次指向头结点,并以相同的速度使两个指针再次向前推进,再次相遇时,就是对应的环起点。 public ListNode detectCycle(ListNode head) { ListNode fast=hea
阅读全文
摘要:这是一道easy题,但是思路还是有点意思,需要判断是否相交我们下意识的能想到我们需要用到双指针,但如何让两个指针能够在链表的相交位置上相遇?我们可以同时让两个指针两个链表的头结点开始遍历,如果到达了链表的尾部则跳到另一个链表的头结点,最终通过返回两个链表相同到达的节点。(如果有相交就是相交节点,如果
阅读全文
摘要:这是一道easy题,直接的方法可以遍历两次,先得到length再走length/2步(向上取整),如果需要一次遍历,可以使用快慢指针,当快指针到达null时,慢指针的位置就是中点。 public ListNode middleNode(ListNode head) { ListNode slow=h
阅读全文
摘要:最老的双指针经典问题了,通过快慢指针即可判断是否存在环。 public class Solution { boolean hasCycle(ListNode head) { // 快慢指针初始化指向 head ListNode slow = head, fast = head; // 快指针走到末尾
阅读全文
摘要:4.由N(N<=10000)个整数组成的数组,其中连续K(K<=200)个元素构成一个区间,称为K区间。一个K区间中所有素数的和记为Sk,请计算整个数组中,所有K区间中的最大Sk值,并输出。输入说明:第一行是两个整数N和K,第二行输入N个数,表示数组中的元素。输出说明:最大Sk值输入样例:8 212
阅读全文
摘要:1.某星球存在两种生物,A种生物有1个头6条腿,B种生物有3个头4条腿。来自地球的太空船刚刚在该星球降落,突然发现一大群这两种生物组成的队伍,由于时间紧,只数了头的数量和腿的数量,请帮助宇航员分析A、B两种生物各有多少个。输入说明:头的数量L腿的数量Z,(L,Z<=100000);输出说明:A生物的
阅读全文

浙公网安备 33010602011771号