前言
🌟🌟本期講解關于力扣的幾篇題解的詳細介紹~~~
🌈感興趣的小伙伴看一看小編主頁:GGBondlctrl-CSDN博客
🔥 你的點贊就是小編不斷更新的最大動力 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
🎆那么廢話不多說直接開整吧~~
?
目錄
📚?1.兩數之和
🚀1.1題目描述
🚀1.2思路分析
🚀1.3代碼編寫
📚?2.存在重復字符II
🚀2.1題目描述
🚀2.2思路分析
🚀2.3代碼編寫
📚?3.字母異位詞分組
🚀3.1題目描述
🚀3.2思路分析
🚀3.3代碼編寫
📚?4.總結
?
📚?1.兩數之和
前提:作為本篇文章的開頭,主要是講解思路,本題比較簡單,大家看看思路就可以了;
🚀1.1題目描述
給定一個整數數組?nums
?和一個整數目標值?target
,請你在該數組中找出?和為目標值?target
? 的那?兩個?整數,并返回它們的數組下標。
你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。
你可以按任意順序返回答案。
大家可能都已經做過這個題了吧~~,因為這是夢的開始?
那么直接開始講解本題的思路過程吧~~~
🚀1.2思路分析
第一種:暴力
這里的思路有兩種,第一種就是暴力枚舉,就是兩層for循環,直接找到我們對應的下標位置;但是肯定還有更加優秀的解法;當然這里的時間復雜度就是O(N^2)的;
第二種:哈希表
這里我們可以使用哈希表進行優化,即當我們遍歷某一個值,要找和等于target的另一個值,那么那個值就是“target - num[ i ]”,沒有找到,就將遍歷的值存入到我們的哈希表中,找到了就直接返回兩個對應的下標;
如下所示:
🚀1.3代碼編寫
暴力我就不演示了,直接編寫我們的哈希表的算法吧~~~
class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> hash = new HashMap<>();for(int i = 0;i < nums.length ;i++){int x = target - nums[i];if(hash.containsKey(x)){return new int[]{i,hash.get(x)};}hash.put(nums[i],i);}return new int[]{0,0};}
}
解釋:注意了,在哈希表中存儲的就是我們要使用的類型,第一個參數就是我們的數組中對應的值,然后就是這個值對應的一個下標;
如果不存在我們要找的值,就將遍歷的數以及下標放入到我們的hash表中;
📚?2.存在重復字符II
🚀2.1題目描述
給你一個整數數組?nums
?和一個整數?k
?,判斷數組中是否存在兩個?不同的索引?i
?和?j
?,足?nums[i] == nums[j]
?且?abs(i - j) <= k
?。如果存在,返回?true
?;否則,返回?false
?。
如下所示:
就是我們可以發現重復的字符,對應的下標是3 - 0 = 3 <= k;所以就返回true;
那么直接講解小編的一個思路吧
🚀2.2思路分析
這里和上面的兩數之和的思路其實一致,只不過就是我們查找的值不一樣了
遍歷數組,若遍歷到的數字,在哈希表中找不到對應的數,那么就存入hash表中,反之找到了那么就要獲取這兩個相等的值的下標之差,若下小于等于k值,就是直接返回true;反之就將之存入到我們的哈希表中~~~
?小細節:
即當存在兩個值相等后,但是下標之差不符合,那么我們可以存入后者值的下標去覆蓋,那么只是符合題意的~~~
🚀2.3代碼編寫
?具體的代碼如下所示:
class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {Map<Integer,Integer> hash = new HashMap<>();for(int i = 0;i < nums.length;i++){if(hash.containsKey(nums[i])){if((i - hash.get(nums[i])) <= k){return true;}}hash.put(nums[i],i);}return false;}
}
大致和第一題沒有什么差別;
📚?3.字母異位詞分組
🚀3.1題目描述
給你一個字符串數組,請你將?字母異位詞?組合在一起。可以按任意順序返回結果列表。
字母異位詞?是由重新排列源單詞的所有字母得到的一個新單詞。
如下所示:
大致就是對于異位詞進行分組;
🚀3.2思路分析
異位詞:就是同樣的組成元素,但是不同排列而成的;
大致的思路就是:
我們將遍歷的字符串,進行ascll碼值的排序操作;將排序后相等的字符串放在一起即可;
大體的思路如下所示:
即如果遍歷到的字符串,進行排序后不存在我們的hash表中,那么存入我們排序后的字符串作為key,然后創建一個新的列表,并將這里的值添加進去;反之存在,那么直接找到對應的Key,然后再添加進入我們的列表中;
🚀3.3代碼編寫
代碼如下所示:
class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String,List<String>> hash = new HashMap<>();for(int i = 0;i < strs.length;i++){String s = changeString(strs[i]);if(!hash.containsKey(s)){hash.put(s,new ArrayList());}hash.get(s).add(strs[i]);}return new ArrayList(hash.values());}public String changeString(String s){char[] ch = s.toCharArray();Arrays.sort(ch);String str = Arrays.toString(ch);return str;}
}
直接可以通過Array.sort進行排序,然后返回我們排序過后的字符串~~~
📚?4.總結
其實除了上述使用java庫中的hash表,那么其實還有一種我們可以自己創建一個hash數組,主要適用于在數據范圍不大的題目中,小編這里就沒有演示,大家可以力扣上面刷刷~~~
本期主要講解了關于hash函數的力扣相關題型
兩數之和(1. 兩數之和 - 力扣(LeetCode))
存在重復字符II(219. 存在重復元素 II - 力扣(LeetCode))
字母異位詞分組(49. 字母異位詞分組 - 力扣(LeetCode))
🌅🌅🌅~~~~最后希望與諸君共勉,共同進步!!!
💪💪💪以上就是本期內容了, 感興趣的話,就關注小編吧。
? ? ?? 😊😊??期待你的關注~~~