随笔分类 - LeetCode每日刷题
以medium为主
    
摘要:一、题目描述 ☆☆☆二、解法 【最优解】:双指针(对撞指针),时间复杂度O(n) 核心是 缩减搜索空间 class Solution { public int maxArea(int[] height) { /** * 方法1:暴力法,时间复杂度O(n^2) */ /*int res = 0; fo
        阅读全文
                
摘要:一、题目描述 二、解法 思路:对撞指针 class Solution { public String reverseVowels(String s) { if (s == null || s.length() < 2) return s; char[] chars = s.toCharArray()
        阅读全文
                
摘要:一、题目描述 二、解法 class Solution { public void reverseString(char[] s) { if (s == null || s.length == 0) return; int l = 0, r = s.length - 1; while (l < r) 
        阅读全文
                
摘要:一、题目描述 二、解法 思路1:双指针。 思路2:reverse后看是否相等。 class Solution { public boolean isPalindrome(String s) { if (s == null) return true; /** * 方法1:双指针 */ char[] c
        阅读全文
                
摘要:一、题目描述 二、解法 思路1:双指针。最优解,时间复杂度为O(n) 思路2:二分搜索。 (Tips:看见 数组 + 有序,第一时间想到 二分!!) 时间复杂度:O(nlogn),其中二分的复杂度为O(logn) class Solution { public int[] twoSum(int[] 
        阅读全文
                
摘要:一、题目描述 ☆☆二、解法 方法1:基于快排的选择方法,即快排partition函数的应用。 Note: 针对本题来说,快排的枢纽点要随机取,否则极端测试用例,会导致退化为O(n^2) 方法2:基于堆排序的选择方法。 解法1: class Solution { public int findKthL
        阅读全文
                
摘要:一、题目描述 二、解法 思路:就是归并排序的 “合并”部分。 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { // 把nums1拷贝一份 int[] temp = new int[m]; for
        阅读全文
                
摘要:一、题目描述 二、解法 思路1:计数排序。分别统计0,1,2的元素个数。 复杂度分析:时间复杂度:O(n);空间复杂度:O(k), k为元素的取值范围; 需要扫描数组两遍。 思路2:三路快排。 只需要遍历数组一遍 重点是设计循环不变量,定义zero和two的含义后,在循环中始终要维护这个定义。 cl
        阅读全文
                
摘要:一、题目描述 ☆☆☆二、解法 思路:快慢指针。 class Solution { public int removeDuplicates(int[] nums) { if (nums == null || nums.length == 0) return 0; /** * 方法1 */ int in
        阅读全文
                
摘要:一、题目描述 二、解法 class Solution { public int removeDuplicates(int[] nums) { if (nums == null || nums.length == 0) return 0; int index = 0; for (int i = 0; 
        阅读全文
                
摘要:一、题目描述 二、解法 思路1:与LeetCode283. 移动零 思路一模一样,相当于把所有等于val的值移到最后。(保持元素的顺序不变) 思路2:每遇到一个元素等于val时,将当前元素与最后一个元素交换,并释放最后一个元素。(元素顺序改变) 分析:思路2中赋值的次数等于要删除元素的数量,因此如果
        阅读全文
                
摘要:一、题目描述 二、解法 class Solution { public void moveZeroes(int[] nums) { if (nums == null || nums.length == 0) return; /** * 方法1: 双指针,两次遍历 -> 把非0的往前挪,然后补0 */
        阅读全文
                
摘要:1 class Solution { 2 public int firstUniqChar(String s) { 3 4 int[] freq = new int[26]; 5 for(int i = 0; i < s.length(); i ++){ 6 freq[s.charAt(i) - '
        阅读全文
                
摘要:分析:在这个案例中,Trie是作为一种映射来使用(在Node节点中存储了一个value值)。 集合和映射的关系:映射本身就是把集合中的每一个元素当做一个键,每一键绑定一个value,绑定体现在Node中。 1 import java.util.TreeMap; 2 class MapSum { 3 
        阅读全文
                
摘要:分析:把Trie当做字符串的集合来使用,添加单词,查询单词是否存在 1 import java.util.TreeMap; 2 class WordDictionary { 3 private class Node{ 4 public boolean isWord; 5 public TreeMap
        阅读全文
                
摘要:import java.util.TreeMap; class Trie { private class Node{ public boolean isWord; public TreeMap<Character, Node> next; public Node(boolean isWord){ t
        阅读全文
                
摘要:题目描述: 分析:虽然是求区间和,但数组是不可变的,不可变 意思是 不涉及线段树更新操作。因此可以不使用线段树这种复杂的数据结构,对于该题不使用线段树效果更好,初始化是O(n)的复杂度,以后每次调用只需要O(1)的复杂度。 // 不使用线段树的解决方案 class NumArray { privat
        阅读全文
                
摘要:题解分析:首先求出所有元素的频次(映射Map),然后利用频次求出前k高的元素(优先队列)。具体来说,问题转化为“在N个元素中选出前M个元素,M<<N”,最朴素的想法是采用排序,但使用快排等高级排序算法,复杂度在NlogN;更好的方法是采用优先队列,复杂度在NlogM,其思路是使用优先队列,维护当前看
        阅读全文
                
摘要:分析:使用集合 class Solution { public int[] intersection(int[] nums1, int[] nums2) { Set<Integer> set = new HashSet<>(); Set<Integer> set1 = new HashSet<>()
        阅读全文
                
摘要:import java.util.TreeSet; class Solution { public int uniqueMorseRepresentations(String[] words) { String[] codes = {".-","-...","-.-.","-..",".","..-
        阅读全文
                

浙公网安备 33010602011771号