
哈希
文章平均质量分 52
文艺范ya
慢慢来吧,谁都有努力的过程
展开
-
LeetCode——554. 砖墙
题目描述:你的面前有一堵矩形的、由 n 行砖块组成的砖墙。这些砖块高度相同(也就是一个单位高)但是宽度不同。每一行砖块的宽度之和应该相等。你现在要画一条自顶向下的、穿过最少砖块的垂线。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。给你一个二维数组 wall ,该数组包含这堵墙的相关信息。其中,wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线穿过的砖块数量最少 ,并且返回穿过的砖块数量 。示例 1:原创 2021-05-02 10:04:26 · 243 阅读 · 1 评论 -
LeetCode——386. 字典序排数
题目描述:给定一个整数 n, 返回从 1 到 n 的字典顺序。例如,给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。代码如下:class Solution { public List<Integer> lexicalOrder(int n) { TreeMap<Integer, String> map = new T原创 2021-04-23 16:39:03 · 160 阅读 · 0 评论 -
LeetCode——1387. 将整数按权重排序
题目描述:我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数:如果 x 是偶数,那么 x = x / 2如果 x 是奇数,那么 x = 3 * x + 1比方说,x=3 的权重为 7 。因为 3 需要 7 步变成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。给你三个整数 lo, hi 和 k 。你的任务是将区间 [lo, hi] 之间的整数按照它们的权重 升序排序 ,如果大原创 2021-04-23 15:58:43 · 156 阅读 · 0 评论 -
LeetCode——1636. 按照频率将数组升序排序
题目描述:给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。 请你返回排序后的数组。提示:1 <= nums.length <= 100-100 <= nums[i] <= 100示例 1:输入:nums = [1,1,2,2,2,3]输出:[3,1,1,2,2,2]解释:‘3’ 频率为 1,‘1’ 频率为 2,‘2’ 频率为 3 。示例 2:输入:nums = [2,3,1,3,原创 2021-03-20 10:32:33 · 205 阅读 · 0 评论 -
LeetCode——451. 根据字符出现频率排序
题目描述:给定一个字符串,请将字符串里的字符按照出现的频率降序排列。示例 1:输入:“tree”输出:“eert”解释:'e’出现两次,'r’和’t’都只出现一次。因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。示例 2:输入:“cccaaa”输出:“cccaaa”解释:'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。注意"cacaca"是不正确的,因为相同的字母必须放在一起。示例 3:输入:“Aabb”输出:“bbA原创 2021-03-19 09:42:03 · 385 阅读 · 2 评论 -
HashMap先按照Value升序排序,Value相同再按照Key升序排序
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。注意:arr中不含相同元素。class Solution { public int[] sortByBits(int[] arr) { int n = arr.length; int[] nums = new int[n]; HashMap<Integer,原创 2021-03-12 14:43:06 · 1128 阅读 · 1 评论 -
LeetCode——500. 键盘行
题目描述:给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。美式键盘 中:第一行由字符 “qwertyuiop” 组成。第二行由字符 “asdfghjkl” 组成。第三行由字符 “zxcvbnm” 组成。提示:1 <= words.length <= 201 <= words[i].length <= 100words[i] 由英文字母(小写和大写字母)组成示例 1:输入:words = [“Hel原创 2021-03-10 19:11:46 · 84 阅读 · 0 评论 -
LeetCode——1436. 旅行终点站
题目描述:给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。题目数据保证线路图会形成一条不存在循环的线路,因此只会有一个旅行终点站。提示:1 <= paths.length <= 100paths[i].length == 21 <= cityAi.length, cityBi原创 2021-03-09 10:29:52 · 126 阅读 · 0 评论 -
LeetCode——599. 两个列表的最小索引总和
题目描述:假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。提示:两个列表的长度范围都在 [1, 1000]内。两个列表中的字符串的长度将在[1,30]的范围内。下标从0开始,到列表的长度减1。两个列表都没有重复的元素。示例 1:输入:[“Shogun”, “Tapioca Express原创 2021-03-03 09:42:47 · 99 阅读 · 0 评论 -
LeetCode——面试题 01.04. 回文排列
题目描述:给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。示例1:输入:“tactcoa”输出:true(排列有"tacocat"、“atcocta”,等等)代码如下:class Solution { public boolean canPermutePalindrome(String s) { int len = s.length(); c原创 2021-03-02 10:04:07 · 93 阅读 · 0 评论 -
LeetCode——383. 赎金信
题目描述:给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)注意:你可以假设两个字符串均只含有小写字母。canConstruct(“a”, “b”) -> falsecanConst原创 2021-03-02 08:37:17 · 92 阅读 · 0 评论 -
LeetCode——836. 矩形重叠
题目描述:矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴,左右边平行于 y 轴。如果相交的面积为 正 ,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。给出两个矩形 rec1 和 rec2 。如果它们重叠,返回 true;否则,返回 false 。提示:rect1.length == 4rect2.length == 4-10^9 <= rec1[i], r原创 2021-03-01 20:17:26 · 110 阅读 · 0 评论 -
LeetCode——1122. 数组的相对排序
题目描述:给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中,对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。提示:1 <= arr1.length, arr2.length <= 10000 <= arr1[i], arr2[i] <= 1000arr2 中的元素 arr2[i] 各不相同arr2 中原创 2021-03-01 19:54:19 · 171 阅读 · 0 评论 -
LeetCode——剑指 Offer 50. 第一个只出现一次的字符
题目描述:在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = “abaccdeff”返回 “b”s = “”返回 " "限制:0 <= s 的长度 <= 50000JAVA代码如下:class Solution { public char firstUniqChar(String s) { HashMap<Character, Integer> map = new LinkedHashM原创 2021-02-02 21:45:05 · 94 阅读 · 0 评论 -
LeetCode——1331. 数组序号转换
题目描述:给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。序号代表了一个元素有多大。序号编号的规则如下:序号从 1 开始编号。一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。每个数字的序号都应该尽可能地小。示例 1:输入:arr = [40,10,20,30]输出:[4,1,2,3]解释:40 是最大的元素。 10 是最小的元素。 20 是第二小的数字。 30 是第三小的数字。示例 2:输入:arr = [100,100,100]输出:[1原创 2021-01-14 19:47:14 · 158 阅读 · 0 评论 -
LeetCode——387. 字符串中的第一个唯一字符
题目描述:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。提示:你可以假定该字符串只包含小写字母。示例:s = “leetcode”返回 0s = “loveleetcode”返回 2代码如下:class Solution {public: int firstUniqChar(string s) { int size=s.size(); unordered_map<char,int>m;原创 2020-12-23 10:09:06 · 159 阅读 · 0 评论 -
LeetCode——1394. 找出数组中的幸运数
题目描述:在整数数组中,如果一个整数的出现频次和它的数值大小相等,我们就称这个整数为「幸运数」。给你一个整数数组 arr,请你从中找出并返回一个幸运数。如果数组中存在多个幸运数,只需返回 最大 的那个。如果数组中不含幸运数,则返回 -1 。提示:1 <= arr.length <= 5001 <= arr[i] <= 500示例 1:输入:arr = [2,2,3,4]输出:2解释:数组中唯一的幸运数是 2 ,因为数值 2 的出现频次也是 2 。示例 2:输入:a原创 2020-12-13 20:23:36 · 260 阅读 · 0 评论 -
LeetCode——347. 前 K 个高频元素
题目描述:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。提示:你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。你可以按任意顺序返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]代码原创 2020-12-11 15:50:30 · 118 阅读 · 0 评论 -
LeetCode——1207. 独一无二的出现次数
题目描述:给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。提示:1 <= arr.length <= 1000-1000 <= arr[i] <= 1000示例 1:输入:arr = [1,2,2,1,1,3]输出:true解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。示例 2:输入:arr = [1,2]输出:f原创 2020-12-11 14:01:54 · 133 阅读 · 0 评论 -
LeetCode——506. 相对名次
题目描述:给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌。前三名运动员将会被分别授予 “金牌”,“银牌” 和“ 铜牌”(“Gold Medal”, “Silver Medal”, “Bronze Medal”)。(注:分数越高的选手,排名越靠前。)提示:N 是一个正整数并且不会超过 10000。所有运动员的成绩都不相同。示例 1:输入: [5, 4, 3, 2, 1]输出: [“Gold Medal”, “Silver Medal”, “Bronze Medal”, “4原创 2020-12-11 10:26:08 · 141 阅读 · 0 评论 -
LeetCode——剑指 Offer 03. 数组中重复的数字(哈希表)
题目描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。限制:2 <= n <= 100000示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3代码如下:class Solution {public: int findRepeatNumber(vector<int>&am原创 2020-12-07 16:44:54 · 159 阅读 · 0 评论 -
求第三大的数
题目描述:给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。示例 1:输入: [3, 2, 1]输出: 1解释: 第三大的数是 1.示例 2:输入: [1, 2]输出: 2解释: 第三大的数不存在, 所以返回最大的数 2 .示例 3:输入: [2, 2, 3, 1]输出: 1解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。存在两个值为2的数,它们都排第二。解释:使用set去掉数组中的重复元素。代码如下:class Solution {原创 2020-12-06 19:17:43 · 230 阅读 · 0 评论 -
LeetCode——219. 存在重复元素 II(哈希表)
题目描述:给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。示例 1:输入: nums = [1,2,3,1], k = 3输出: true示例 2:输入: nums = [1,0,1,1], k = 1输出: true示例 3:输入: nums = [1,2,3,1,2,3], k = 2输出: false代码如下:class Solution {public:原创 2020-12-04 16:43:06 · 168 阅读 · 0 评论 -
LeetCode——169. 多数元素(哈希表)
题目描述:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2代码如下:class Solution {public: int majorityElement(vector<int>& nums) { int size=nums.size原创 2020-12-03 22:04:16 · 189 阅读 · 0 评论 -
LeetCode——面试题 02.01. 移除重复节点
题目描述:利用散列表(哈希表)遍历链表散列表知识:散列表代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* removeDuplicateNodes原创 2020-11-18 17:10:07 · 131 阅读 · 0 评论 -
散列表
散列表的查找:**基本思想:记录存储位置和关键字之间的对应关系——hash函数散列函数H(key)= k;优点:查找效率高缺点:空间效率低散列表若干术语:散列方法(杂凑法)选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行比,确定查找是否成功。散列函数(杂凑函数):散列函数中使用的转换函数。冲突:不同的关键码映射到相同的散列位置在散列查找方法中,冲突是不可避免的,只能去尽量减少。key1不等于key原创 2020-11-18 15:56:22 · 460 阅读 · 0 评论