摘要:示例輸入輸出示例輸入輸出說(shuō)明輸出結(jié)果中的每個(gè)元素一定是唯一的。示例輸入輸出示例輸入輸出說(shuō)明輸出結(jié)果中每個(gè)元素出現(xiàn)的次數(shù),應(yīng)與元素在兩個(gè)數(shù)組中出現(xiàn)次數(shù)的最小值一致。在完成所有重復(fù)項(xiàng)刪除操作后返回最終的字符串。
給定兩個(gè)字符串 s 和 t ,編寫(xiě)一個(gè)函數(shù)來(lái)判斷 t 是否是 s 的字母異位詞。
注意:若 s 和 t 中每個(gè)字符出現(xiàn)的次數(shù)都相同,則稱(chēng) s 和 t 互為字母異位詞。
示例 1:
輸入: s = "anagram", t = "nagaram"輸出: true
示例 2:
輸入: s = "rat", t = "car"輸出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和 t
僅包含小寫(xiě)字母數(shù)組是一種最簡(jiǎn)單的哈希表,因?yàn)閮蓚€(gè)字符串只包含小寫(xiě)字母所以我們可以設(shè)置一個(gè)長(zhǎng)度為26的數(shù)組,0-25分別對(duì)應(yīng)a-z出現(xiàn)的次數(shù),最后再遍歷一次數(shù)組如果出現(xiàn)了不為1的元素就表明兩個(gè)字符串不是有效的字母異位詞
class Solution { public boolean isAnagram(String s, String t) { int[] result = new int[26]; for(int i = 0; i < s.length(); i++) { result[s.charAt(i) - "a"]++; } for(int j = 0; j < t.length(); j++) { result[t.charAt(j) - "a"]--; } for(int k = 0; k < 26; k++) { if(result[k] != 0) { return false; } } return true; }}
O(n)
O(1)
給定兩個(gè)數(shù)組,編寫(xiě)一個(gè)函數(shù)來(lái)計(jì)算它們的交集。
示例 1:
輸入:nums1 = [1,2,2,1], nums2 = [2,2]輸出:[2]
示例 2:
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]輸出:[9,4]
說(shuō)明:
這道題是虛假的求交集,即只是求出元素并不要求元素的個(gè)數(shù)所以我們可以聲明兩個(gè)set集合,然后將兩個(gè)set集合中包含的元素加入到結(jié)果數(shù)組中
也可以使用排序雙指針求解這里就不做演示了
class Solution { public int[] intersection(int[] nums1, int[] nums2) { HashSet<Integer> set = new HashSet<>(); HashSet<Integer> set0 = new HashSet<>(); int i = 0; for(int item : nums1) { set.add(item); } for(int item : nums2) { if(set.contains(item)) set0.add(item); } int[] result = new int[set0.size()]; for(int item : set0) { result[i] = item; i++; } return result; }}
O(n)
O(n)
給定兩個(gè)數(shù)組,編寫(xiě)一個(gè)函數(shù)來(lái)計(jì)算它們的交集。
示例 1:
輸入:nums1 = [1,2,2,1], nums2 = [2,2]輸出:[2,2]
示例 2:
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]輸出:[4,9]
說(shuō)明:
真正的求交集,和上一題一樣也是兩種思路,排序雙指針的會(huì)簡(jiǎn)單一些
排序雙指針
class Solution { public int[] intersect(int[] nums1, int[] nums2) { //將數(shù)組排序 Arrays.sort(nums1); Arrays.sort(nums2); //定義雙指針?lè)謩e指向兩個(gè)數(shù)組的頭部 int a = 0, b = 0; //定義結(jié)果集 int[] result = new int[Math.min(nums1.length,nums2.length)]; //定義遍歷結(jié)果集指針 int k = 0; while(a < nums1.length && b < nums2.length) { if(nums1[a] == nums2[b]) { //第一種情況:如果兩數(shù)相等就將數(shù)字加入到結(jié)果集中并讓兩個(gè)指針同時(shí)移動(dòng) result[k++] = nums1[a]; a++; b++; } else if(nums1[a] > nums2[b]) { //第二種情況:如果第一個(gè)數(shù)組的值大于第二個(gè)數(shù)組那么就讓值小的數(shù)組的指針前移 b++; } else { //第三種情況:如果第二個(gè)數(shù)組的值大于第一個(gè)數(shù)組那么就讓值小的數(shù)組的指針前移 a++; } } return Arrays.copyOfRange(result, 0, k); }}
時(shí)間復(fù)雜度
O(n)
空間復(fù)雜度
O(n)
兩個(gè)map模擬并集
class Solution { public int[] intersect(int[] nums1, int[] nums2) { //存儲(chǔ)第一數(shù)組的元素和個(gè)數(shù)的key和value HashMap map0 = new HashMap<>(); //存儲(chǔ)第二個(gè)數(shù)組的元素和個(gè)數(shù)的key和value HashMap map1 = new HashMap<>(); //存儲(chǔ)并集 HashMap temp = new HashMap<>(); //將第一數(shù)組的元素和對(duì)應(yīng)的元素存儲(chǔ)到map中 for(int i = 0; i < nums1.length; i++) { if(map0.containsKey(nums1[i])) { map0.replace(nums1[i], map0.get(nums1[i]) + 1); } else { map0.put(nums1[i], 1); } } //將第二數(shù)組的元素和對(duì)應(yīng)的元素存儲(chǔ)到map中 for(int j = 0; j < nums2.length; j++) { if(map1.containsKey(nums2[j])) { map1.replace(nums2[j], map1.get(nums2[j]) + 1); } else { map1.put(nums2[j], 1); } } //模擬并集的過(guò)程,將兩個(gè)數(shù)組的相同元素作為key并將元素個(gè)數(shù)的最小值作為value存儲(chǔ)到result結(jié)集合中 for(int index : map0.keySet()) { if(map1.containsKey(index)) { temp.put(index,Math.min(map0.get(index), map1.get(index))); } } //定義數(shù)組長(zhǎng)度 int length = 0; //將并集的長(zhǎng)度求出來(lái) //具體做法為將result集合中所有的value求和 for(int index : temp.values()) { length += index; } //定義返回?cái)?shù)組 int[] result = new int[length]; /** * k 用來(lái)遍歷數(shù)組 * e 限制每個(gè)key的value循環(huán) */ int k = 0, e = 0; for(int index : temp.keySet()) { e = 0; while(e < temp.get(index)) { result[k++] = index; e++; } } return result; }}
時(shí)間復(fù)雜度
O(n)
空間復(fù)雜度
O(n)
編寫(xiě)一個(gè)算法來(lái)判斷一個(gè)數(shù) n
是不是快樂(lè)數(shù)。
「快樂(lè)數(shù)」定義為:
如果 n
是快樂(lè)數(shù)就返回 true
;不是,則返回 false
。
示例 1:
輸入:n = 19輸出:true解釋?zhuān)?2 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1
示例 2:
輸入:n = 2輸出:false
提示:
1 <= n <= 231 - 1
將數(shù)通過(guò)%10分離個(gè)位數(shù)再通過(guò)/10移除個(gè)位數(shù)并讓其他位數(shù)順位減一,將分離完的個(gè)位數(shù)依次平方求和然后儲(chǔ)存到set集合中,循環(huán)這個(gè)過(guò)程,如果平方和和set中的元素重復(fù)那么這個(gè)數(shù)就不是快樂(lè)數(shù)
class Solution { public boolean isHappy(int n) { //定義哈希set存儲(chǔ)每次sum的值如果添加sum的時(shí)候sum重復(fù)了那就返回false HashSet set = new HashSet<>(); int sum = n; //如果sum不為1 while(sum != 1) { if(set.contains(sum)){ return false; }else{ set.add(sum); } sum = 0; while(n != 0) { sum += Math.pow(n % 10, 2); n /= 10; } n = sum; } return true; }}
O(logn)
O(logn)
給定一個(gè)整數(shù)數(shù)組 nums 和一個(gè)整數(shù)目標(biāo)值 target,請(qǐng)你在該數(shù)組中找出 和為目標(biāo)值 target 的那 兩個(gè) 整數(shù),并返回它們的數(shù)組下標(biāo)。
你可以假設(shè)每種輸入只會(huì)對(duì)應(yīng)一個(gè)答案。但是,數(shù)組中同一個(gè)元素在答案里不能重復(fù)出現(xiàn)。
你可以按任意順序返回答案。
示例 1:
輸入:nums = [2,7,11,15], target = 9輸出:[0,1]解釋?zhuān)阂驗(yàn)?nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
輸入:nums = [3,2,4], target = 6輸出:[1,2]
示例 3:
輸入:nums = [3,3], target = 6輸出:[0,1]
提示:
這道題求解思路很多,暴力硬A的,二分查找,也可以使用哈希表來(lái)求得
使用目標(biāo)數(shù)字減去數(shù)組的值如果map中存在那么就返回這兩個(gè)值如果map中不存在那么就將這個(gè)數(shù)組元素和數(shù)組下標(biāo)存入map中
class Solution { public int[] twoSum(int[] nums, int target) { int[] result = new int[2]; if(nums == null || nums.length == 0) { return result; } HashMap<Integer,Integer> map = new HashMap<>(); for(int i = 0; i < nums.length; i++) { int temp = target - nums[i]; if(map.containsKey(temp)) { result[0] = i; result[1] = map.get(temp); return result; } map.put(nums[i], i); } return result; }}
O(n)
O(n)
給你四個(gè)整數(shù)數(shù)組 nums1、nums2、nums3 和 nums4 ,數(shù)組長(zhǎng)度都是 n ,請(qǐng)你計(jì)算有多少個(gè)元組 (i, j, k, l) 能滿(mǎn)足:
示例 1:
輸入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]輸出:2解釋?zhuān)簝蓚€(gè)元組如下:1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 02. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
示例 2:
輸入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]輸出:1
提示:
因?yàn)轭}解的最后是需要得到能夠構(gòu)成0的個(gè)數(shù),所以我們可以將前兩個(gè)數(shù)組的元素之和求出同時(shí)統(tǒng)計(jì)出現(xiàn)的次數(shù)記錄到map中,然后再統(tǒng)計(jì)剩余元素的和,在map中尋找后兩個(gè)元素相加求和的相反數(shù)如果能找到就記錄出現(xiàn)的次數(shù)
class Solution { public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { Map<Integer, Integer> map = new HashMap<>(); int temp; int res = 0; //統(tǒng)計(jì)兩個(gè)數(shù)組中的元素之和,同時(shí)統(tǒng)計(jì)出現(xiàn)的次數(shù),放入map for (int i : nums1) { for (int j : nums2) { temp = i + j; if (map.containsKey(temp)) { map.put(temp, map.get(temp) + 1); } else { map.put(temp, 1); } } } //統(tǒng)計(jì)剩余的兩個(gè)元素的和,在map中找是否存在相加為0的情況,同時(shí)記錄次數(shù) for (int i : nums3) { for (int j : nums4) { temp = i + j; if (map.containsKey(0 - temp)) { res += map.get(0 - temp); } } } return res; }}
O(n^2)
O(n)
為了不在贖金信中暴露字跡,從雜志上搜索各個(gè)需要的字母,組成單詞來(lái)表達(dá)意思。
給你一個(gè)贖金信 (ransomNote) 字符串和一個(gè)雜志(magazine)字符串,判斷 ransomNote 能不能由 magazines 里面的字符構(gòu)成。
如果可以構(gòu)成,返回 true ;否則返回 false 。
magazine 中的每個(gè)字符只能在 ransomNote 中使用一次。
示例 1:
輸入:ransomNote = "a", magazine = "b"輸出:false
示例 2:
輸入:ransomNote = "aa", magazine = "ab"輸出:false
示例 3:
輸入:ransomNote = "aa", magazine = "aab"輸出:true
提示:
因?yàn)橹恍枰猰agazine中的字符在ransomNote中出現(xiàn)的次數(shù)一致就可以了,所以我們用數(shù)組來(lái)記錄贖金信中的字母及其個(gè)數(shù),然后將雜志中的元素進(jìn)行比對(duì)
class Solution { public boolean canConstruct(String ransomNote, String magazine) { int[] result = new int[26]; for(int i = 0; i < ransomNote.length(); i++) { // 遍歷贖金信并記錄次數(shù) result[ransomNote.charAt(i) - "a"]++; } for(int j = 0; j < magazine.length(); j++) { // 將雜志中的字符串和贖金信中的做比對(duì) if(result[magazine.charAt(j) - "a"] != 0) result[magazine.charAt(j) - "a"]--; } for(int i = 0; i < 26; i++) { if(result[i] != 0) return false; } return true; }}
O(n + m)
O(1)
給你一個(gè)包含 n 個(gè)整數(shù)的數(shù)組 nums,判斷 nums 中是否存在三個(gè)元素 a,b,c ,使得 a + b + c = 0 ?請(qǐng)你找出所有和為 0 且不重復(fù)的三元組。
注意:答案中不可以包含重復(fù)的三元組。
示例 1:
輸入:nums = [-1,0,1,2,-1,-4]輸出:[[-1,-1,2],[-1,0,1]]
示例 2:
輸入:nums = []輸出:[]
示例 3:
輸入:nums = [0]輸出:[]
排序雙指針,首先確認(rèn)第一個(gè)元素,如果第一個(gè)元素大于0就沒(méi)有后續(xù)的必要了,因?yàn)椴豢梢园貜?fù)的三元組所以還涉及到了去重的操作,再確認(rèn)好第一個(gè)元素之后,剩下兩個(gè)元素的值也很好確認(rèn)可以使用雙指針來(lái)分別指向末尾和第一個(gè)元素后一位的元素
class Solution { public List<List<Integer>> threeSum(int[] nums) { //定義結(jié)果集LinkedList相比于ArrayList添加和刪除效率比較高 List> result = new LinkedList>(); //如果數(shù)組長(zhǎng)度小于3就不需要進(jìn)行后續(xù)操作了直接返回空的結(jié)果集即可 if(nums.length < 3) { return result; } //我們采用排序雙指針的方法方便去重的操作 Arrays.sort(nums); for(int i = 0; i < nums.length; i++) { //因?yàn)閿?shù)組已經(jīng)排過(guò)序了如果第一個(gè)值是正數(shù)后面就沒(méi)必要比較了 if(nums[i] > 0) break; //如果從數(shù)組第二個(gè)值開(kāi)始,當(dāng)前元素和前一個(gè)元素相同那么直接跳過(guò)本次循環(huán) if(i > 0 && nums[i - 1] == nums[i]) continue; //a > b > c 由于第一個(gè)元素的確認(rèn)我們把他看作常數(shù)對(duì)待那么 滿(mǎn)足函數(shù) a(常數(shù)) + b(未知量) = -c(未知量) 形狀有點(diǎn)像 y = -x int left = i + 1; int right = nums.length - 1; while(left < right) { // temp = a + b + c if(nums[left] + nums[right] == -nums[i]) { result.add(new LinkedList(Arrays.asList(nums[i], nums[left], nums[right]))); left++; right--; //去重操作 while(left < right && nums[left] == nums[left - 1]) left++; while(left < right && nums[right] == nums[right + 1]) right--; } else if(nums[left] + nums[right] > -nums[i]) { right--; } else if(nums[left] + nums[right] < -nums[i]) { left++; } } } return result; }}
O(n^2)
O(n)
這道題和15題核心思路基本一致
class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { //創(chuàng)建結(jié)果集 List> result = new LinkedList>(); if(nums.length < 4) { return result; } //排序雙指針 Arrays.sort(nums); for(int i = 0; i < nums.length - 3; i++) { //去重 if(i > 0 && nums[i - 1] == nums[i]) { continue; } for(int j = i + 1; j < nums.length - 2; j++) { //去重 if(j > i + 1 && nums[j - 1] == nums[j]) { continue; } int left = j + 1; int right = nums.length - 1; int temp = target - nums[i] - nums[j]; while(left < right) { int sum = nums[left] + nums[right]; if(sum == temp) { result.add(new LinkedList(Arrays.asList(nums[i], nums[j], nums[left], nums[right]))); left++; right--; //去重 while(left < right && nums[left] == nums[left - 1]) left++; while(left < right && nums[right] == nums[right + 1]) right--; } else if(sum < temp) { left++; } else { right--; } } } } return result; }}
請(qǐng)你僅使用兩個(gè)棧實(shí)現(xiàn)先入先出隊(duì)列。隊(duì)列應(yīng)當(dāng)支持一般隊(duì)列支持的所有操作(push、pop、peek、empty):
實(shí)現(xiàn) MyQueue 類(lèi):
模擬題仔細(xì)就可以了
class MyQueue { //定義兩個(gè)棧 Stack stack0 = null; Stack stack1 = null; //初始化兩個(gè)棧 public MyQueue() { stack0 = new Stack<>(); stack1 = new Stack<>(); } //如果棧1不為空那就先將棧1的元素全部出棧添加到棧0然后向棧0中添加新元素 public void push(int x) { if(stack1.size() != 0) { while(stack1.size() != 0) { stack0.push(stack1.pop()); } } stack0.push(x); } //如果棧0中包含元素那么就將所有元素出棧并添加到棧1中移除并返回棧1的棧頂元素 public int pop() { if(stack0.size() != 0) { while(stack0.size() != 0) { stack1.push(stack0.pop()); } } return stack1.pop(); } //如果棧0中包含元素那么就將所有元素出棧并添加到棧1中返回棧1的棧頂元素 public int peek() { if(stack0.size() != 0) { while(stack0.size() != 0) { stack1.push(stack0.pop()); } } return stack1.peek(); } //查看棧0和棧1中是否含有元素 public boolean empty() { return stack1.isEmpty() && stack0.isEmpty(); }}
模擬題我是使用一個(gè)隊(duì)列實(shí)現(xiàn)的
class MyStack { List<Integer> list0 = null; //初始化隊(duì)列 public MyStack() { list0 = new LinkedList(); } public void push(int x) { list0.add(x); } public int pop() { return list0.remove(list0.size() - 1); } public int top() { return list0.get(list0.size() - 1); } public boolean empty() { return list0.isEmpty(); }}
棧很適合用來(lái)做匹配消除,遍歷整個(gè)字符串,如果棧中元素不為空并且棧頂元素和對(duì)應(yīng)的右括號(hào)匹配就彈出棧
class Solution { public boolean isValid(String s) { //定義一個(gè)棧 Stack stack = new Stack<>(); for(int i = 0; i < s.length(); i++) { if(!stack.isEmpty() && stack.peek() == isType(s.charAt(i))) { stack.pop(); continue; } stack.push(s.charAt(i)); } return stack.isEmpty(); } public char isType(char c) { char flag = "/0"; if(c == ")") { flag = "("; }else if(c == "]") { flag = "["; }else if(c == "}") { flag = "{"; } return flag; }}
O(n)
O(n)
給出由小寫(xiě)字母組成的字符串 S,重復(fù)項(xiàng)刪除操作會(huì)選擇兩個(gè)相鄰且相同的字母,并刪除它們。
在 S 上反復(fù)執(zhí)行重復(fù)項(xiàng)刪除操作,直到無(wú)法繼續(xù)刪除。
在完成所有重復(fù)項(xiàng)刪除操作后返回最終的字符串。答案保證唯一。
輸入:"abbaca"輸出:"ca"解釋?zhuān)豪?,?"abbaca" 中,我們可以刪除 "bb" 由于兩字母相鄰且相同,這是此時(shí)唯一可以執(zhí)行刪除操作的重復(fù)項(xiàng)。之后我們得到字符串 "aaca",其中又只有 "aa" 可以執(zhí)行重復(fù)項(xiàng)刪除操作,所以最后的字符串為 "ca"。
/** * 第一種思路,用棧來(lái)實(shí)現(xiàn) * 依次將字符串的字符入棧如果兩兩相當(dāng),那么就消除 */class Solution { public String removeDuplicates(String s) { LinkedList<Character> queue = new LinkedList<>(); char temp; for(int i = 0; i < s.length(); i++) { temp = s.charAt(i); // 如果棧為空或者棧頂元素不等于temp就入棧,否則就出棧 if(queue.isEmpty() || queue.peek() != temp) { queue.push(temp); } else { queue.pop(); } } // 剩余的元素就是最終字符串,但是由于棧的結(jié)構(gòu)所以得出來(lái)的字符串是反的需要換一下 String result = ""; while(!queue.isEmpty()) { result += queue.pop(); } result = new StringBuffer(result).reverse().toString(); return result; }}
/** * 第二種思路,字符串模擬棧 */class Solution { public String removeDuplicates(String s) { StringBuffer buffer = new StringBuffer(); char temp; // 記錄buffer的長(zhǎng)度,為什么是-1? // 之所以是-1是因?yàn)榈谝粋€(gè)元素是默認(rèn)添加的,它的索引值為0,此時(shí)為了能夠判斷第二次循環(huán)條件, // l模仿指向棧頂 int l = -1; for(int i = 0; i < s.length(); i++) { temp = s.charAt(i); // 如果此時(shí)字符串的尾部元素和temp相同那么就把字符串尾部刪除,為了添加第一個(gè)元素所以需要設(shè)置temp >= 0 if(l >= 0 && temp == buffer.charAt(l)) { buffer.deleteCharAt(l); l--; } else { buffer.append(temp); l++; } } return buffer.toString(); }}
/** * 第三種思路,雙指針?lè)?直接使用現(xiàn)有字符串使用雙指針覆蓋重復(fù)的元素 */class Solution { public String removeDuplicates(String s) { char[] c = s.toCharArray(); int slow = 0; for(int fast = 0; fast < s.length(); fast++) { c[slow] = c[fast]; // 如果slow指向的元素和slow-1所指向的元素相等那么就讓slow指針后移,下次循環(huán)直接就覆蓋掉了 if(slow > 0 && c[slow] == c[slow - 1]) { slow--; } else { slow++; } } return new String(c,0,slow); }}
根據(jù) 逆波蘭表示法,求表達(dá)式的值。
有效的算符包括 +
、-
、*
、/
。每個(gè)運(yùn)算對(duì)象可以是整數(shù),也可以是另一個(gè)逆波蘭表達(dá)式。
說(shuō)明:
示例 1:
輸入:tokens = ["2","1","+","3","*"]輸出:9解釋?zhuān)涸撍闶睫D(zhuǎn)化為常見(jiàn)的中綴算術(shù)表達(dá)式為:((2 + 1) * 3) = 9
示例 2:
輸入:tokens = ["4","13","5","/","+"]輸出:6解釋?zhuān)涸撍闶睫D(zhuǎn)化為常見(jiàn)的中綴算術(shù)表達(dá)式為:(4 + (13 / 5)) = 6
求解逆波蘭表達(dá)式,如果是數(shù)字直接入棧,如果是操作符,從棧中取出兩個(gè)元素進(jìn)行操作后再壓入棧
class Solution { public int evalRPN(String[] tokens) { //定義一個(gè)棧便于存儲(chǔ)運(yùn)算數(shù)字 Stack<Integer> stack = new Stack<Integer>(); //因?yàn)楸闅v到+ - * /需要出棧兩個(gè)字符計(jì)算后入棧所以設(shè)置兩個(gè)變量 int a = 0; int b = 0; for(int i = 0; i < tokens.length; i++) { if ("+".equals(tokens[i])) { a = stack.pop(); b = stack.pop(); stack.push(b + a); } else if ("-".equals(tokens[i])) { a = stack.pop(); b = stack.pop(); stack.push(b - a); } else if ("*".equals(tokens[i]))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/124497.html
摘要:此專(zhuān)欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn)當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解目的是為了更方便快捷的記憶和回憶算法重點(diǎn)不用每次都重復(fù)看題解畢竟算法不是做了一遍就能完全記住的所 ...
摘要:圖因此可以成為樹(shù),在所有可能的樹(shù)中,具有最小高度的樹(shù)被稱(chēng)為最小高度樹(shù)。給出這樣的一個(gè)圖,寫(xiě)出一個(gè)函數(shù)找到所有的最小高度樹(shù)并返回他們的根節(jié)點(diǎn)。因此使用一個(gè)數(shù)組代表每個(gè)節(jié)點(diǎn)的入度,若入度為就是葉子節(jié)點(diǎn)。 題目地址:https://leetcode-cn.com/probl...題目描述: 對(duì)于一個(gè)具有樹(shù)特征的無(wú)向圖,我們可選擇任何一個(gè)節(jié)點(diǎn)作為根。圖因此可以成為樹(shù),在所有可能的樹(shù)中,具有最小...
此專(zhuān)欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號(hào)先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...
此專(zhuān)欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號(hào)先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...
閱讀 1131·2021-11-23 09:51
閱讀 1103·2021-10-18 13:31
閱讀 3038·2021-09-22 16:06
閱讀 4329·2021-09-10 11:19
閱讀 2228·2019-08-29 17:04
閱讀 455·2019-08-29 10:55
閱讀 2522·2019-08-26 16:37
閱讀 3407·2019-08-26 13:29