集合
java 集合
059
这个作者很懒,什么都没留下…
展开
-
车队(空间换时间典型方法)
一、题目N 辆车沿着一条车道驶向位于 target 英里之外的共同目的地。每辆车 i 以恒定的速度 speed[i] (英里/小时),从初始位置 position[i] (英里) 沿车道驶向目的地。一辆车永远不会超过前面的另一辆车,但它可以追上去,并与前车以相同的速度紧接着行驶。此时,我们会忽略这两辆车之间的距离,也就是说,它们被假定处于相同的位置。车队 是一些由行驶在相同位置、具有相同速度的车组成的非空集合。注意,一辆车也可以是一个车队。即便一辆车在目的地才赶上了一个车队,它们仍然会被视作是原创 2022-01-15 23:40:38 · 189 阅读 · 0 评论 -
O(1) 时间插入、删除和获取随机元素
一、题目二、代码时间复杂度o(1),不能有for循环class RandomizedSet { //只要存在for循环时间复杂度就不是o(1)了,保证时间复杂度就需要以空间换时间 private List<Integer> list = null; private Map<Integer, Integer> hashMap = null; private Random random = new Random(); /**..原创 2021-08-21 16:59:05 · 150 阅读 · 0 评论 -
重复的DNA序列(滑动窗口 )
一、题目二、代码滑动窗口class Solution { //滑动窗口 + hashSet去重 public List<String> findRepeatedDnaSequences(String s) { int windowLen = 10; int len = s.length(); Set<String> DnaSet = new HashSet<>(); /...原创 2021-08-21 16:48:18 · 393 阅读 · 0 评论 -
数组中的第K个最大元素(优先队列和快速排序变种)
一、题目给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。输入: [3,2,1,5,6,4] 和 k = 2输出: 5二、思路jdk自带的排序算法,比较容易想到class Solution { public int findKthLargest(int[] nums, int k) { int len = nums.length; Arra...原创 2021-07-24 14:38:33 · 563 阅读 · 1 评论 -
二叉树的序列化与反序列化
一、题目序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。二、代码前序遍历/** * Definition for a binary tree node. * public clas.原创 2021-02-09 15:29:47 · 102 阅读 · 0 评论 -
存在重复元素
class Solution { public boolean containsDuplicate(int[] nums) { Map<Integer, Integer> numMap = new HashMap<>(); for(int num : nums){ int count = 1; if(numMap.get(num) == null){ ...原创 2020-08-24 11:26:25 · 88 阅读 · 0 评论 -
只出现一次的数字
引入HashMapclass Solution { public int singleNumber(int[] nums) { Map<Integer, Integer> countMap = new HashMap<>(); for(int num : nums){ if(!countMap.containsKey(num)){ countMap.put(num, 1); ..原创 2020-08-20 18:18:28 · 114 阅读 · 0 评论 -
杨辉三角
代码class Solution { public List<List<Integer>> generate(int numRows) { //初始化 List<List<Integer>> allList = new ArrayList<>(); for(int i = 0; i < numRows; i++){ List<Integer>...原创 2020-08-20 17:49:51 · 101 阅读 · 0 评论 -
LRU缓存机制
代码哈希表+ 双链表class LRUCache { //双向链表节点 private static class DListNode{ int key; int value; DListNode prev; DListNode next; DListNode(){ } DListNode(int key, int value){ this...原创 2020-08-18 21:59:22 · 143 阅读 · 0 评论 -
两数之和
暴力法class Solution { public int[] twoSum(int[] nums, int target) { int []numId = new int[2]; for(int i = 0; i < nums.length; i++ ){ for(int j = i + 1; j < nums.length; j++){ if(nums[i] + nums[j] ==...原创 2020-08-14 13:18:09 · 160 阅读 · 0 评论 -
环形链表
快慢指针/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public boolean hasCycle(ListNod...原创 2020-08-13 22:18:13 · 86 阅读 · 0 评论 -
二叉树层次遍历
代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { List<List<Integer>> nodeLists = new Arra...原创 2020-08-09 22:46:06 · 184 阅读 · 0 评论 -
矩阵置零
一、题目二、代码使用Set分别对元素为0的行号和列号去重class Solution { public void setZeroes(int[][] matrix) { Set<Integer> rowSet = new HashSet<>(); Set<Integer> columnSet = new HashSet<>(); int m = matrix.length; ..原创 2020-07-22 11:14:43 · 121 阅读 · 0 评论 -
合并区间(贪心)
一、题目二、代码贪心算法:先按照区间左端点的值升序排序 如果当前遍历到的区间的左端点大于结果集中最后一个区间的右端点,说明它们没有交集,此时把区间添加到结果集 如果当前遍历到的区间的左端点小于结果集中最后一个区间的右端点,说明它们有交集,合并 class Solution { public int[][] merge(int[][] intervals) { if(intervals.length < 2) return intervals;.原创 2020-07-19 12:04:02 · 136 阅读 · 0 评论 -
字母异位词分组
一、题目二、代码当且仅当它们的排序字符串相等时,字符串是字母异位词,因此维护一个HashMap,键为排序后的字符串,value为字母异位词列表。注意字符串和字符数组的相互转化。class Solution { public List<List<String>> groupAnagrams(String[] strs) { List<List<String>> result = new ArrayList<&g..原创 2020-07-12 12:38:06 · 99 阅读 · 0 评论 -
组合总数II
一、题目二、代码此题与上题的不同在于候选数组存在相同的数字,而且最终的组合中,候选数组中每个数字只能出现一次,如何去重是本题的难点,可以[2,5,2,1,2]为例。class Solution { List<List<Integer>> result = new LinkedList<>(); public List<List<Integer>> combinationSum2(int[] candidate...原创 2020-07-09 13:19:46 · 115 阅读 · 0 评论 -
组合总和
一、题目二、代码回溯class Solution { List<List<Integer>> result = new LinkedList<>(); public List<List<Integer>> combinationSum(int[] candidates, int target) { if (candidates == null || candidates.length == 0 |.原创 2020-07-08 12:36:25 · 146 阅读 · 0 评论 -
有效的数独
一、题目二、代码一行一行的遍历,注意子数独下标 boxIndex = (i / 3) * 3 + j / 3class Solution { public boolean isValidSudoku(char[][] board) { Map<Integer, Integer>[] rowsMap = new HashMap[9]; Map<Integer, Integer>[] columnsMap = new Has...原创 2020-07-07 12:53:34 · 121 阅读 · 0 评论 -
三指针解决三数之和
一、题目二、代码最容易想到的思路就是暴力解法,三重循环,但是会超时。下面采用排序 + 双指针的方法进行优化。对数组进行排序 遍历该数组。如果nums[i]>0,后面的数肯定都>0,不会出现三数相加==0的情况,可以直接返回。如果nums[i] == nums[i + 1],属于重复元素,可能会出现重复解,因此跳过 设置双指针 j = i + 1, m = len - 1。j < m时,执行循环: 当 nums[i]+nums[j]+nums[m]==0,执..原创 2020-06-15 15:39:03 · 215 阅读 · 0 评论 -
罗马数字转整数
一、题目二、代码class Solution { public int romanToInt(String s) { Map<Character, Integer> numsMap = new HashMap<>(); numsMap.put('I', 1); numsMap.put('V', 5); numsMap.put('X', 10); numsMap.put('L', 5.原创 2020-06-10 20:39:13 · 159 阅读 · 0 评论 -
无重复字符的最长子串
一、思路最容易想到是二重循环(暴力解法),引入hashmap记录不重复的字符。二、代码class Solution { public int lengthOfLongestSubstring(String s) { if(s.equals("")){ //空串处理 return 0; } int count = 0; List<Integer> countList = new Ar.原创 2020-06-05 14:31:11 · 105 阅读 · 0 评论 -
总持续时间可被 60 整除的歌曲
一、思路此题首先就会想到二重循环、暴力破解,但是时间复杂度过大。二、代码引入HashMap,简化运算。class Solution { /** * hash存储余数 * 使用余数,提高缓存命中率 * * @param time * @return */ public int numPairsDivisibleBy60(int[] time) { int num = 0; Map<..原创 2020-06-03 16:38:41 · 88 阅读 · 0 评论 -
两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2]考虑此题,可用Set的去重特性去做思路:分别将两个数组,放入集合筛选掉重复的元素 根据在集合中添加重复元素时,返回值为false,将重复元素写入动态数组 由动态数组的size确定数组应该申请的空间,并转移元素。代码如下class Solution { public int[] intersection(int[] nums1原创 2020-05-25 17:13:48 · 212 阅读 · 0 评论