原创 leetcode C++ 6. Z 字形變換 將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。

一、思路:       對於Z字型的第i行數據爲:let temp1=(row-i-1)*2   temp2=i*2       i     i+temp1   i+temp1+temp2  1+temp1*2+temp2  1+temp

原创 leetcode C++ 45. 跳躍遊戲 II 給定一個非負整數數組,你最初位於數組的第一個位置。 數組中的每個元素代表你在該位置可以跳躍的最大長度。 你的目標是使用最少的跳躍次數到達數組的最後

一、思路:     1、深度搜索,不剪枝,只能通過71多個      2、深度搜索,map存儲每一個pos的count,凡是後面超過這個count,停止搜索,剪枝,最後兩個也通過不了      3、O(n), 通過當前節點找到下下節點的最

原创 leetcode C++ 48. 旋轉圖像 給定一個 n × n 的二維矩陣表示一個圖像。 將圖像順時針旋轉 90 度。

一、思路:        某一個的轉化後的路徑變化:(i,j)-->(j,n-1-i)-->(n-1-i,n-1-j)-->(i,j), 所以轉變一個,就等於轉變4個,n爲偶數數時,遍歷n*n/4;n爲奇數時,遍歷(n*n-1)/4,因爲

原创 C++ leetcode 19. 刪除鏈表的倒數第N個節點 給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。

一、思路:      遍歷一遍存儲節點到vector數組中,然後利用數組指向倒數第n個,將倒數n-1的節點的next指向倒數n的next 二、代碼: class Solution { public: ListNode* removeN

原创 leetCode C++ 49. 字母異位詞分組 給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。

一、思路:       對每一個字符串排序,然後將這個排序的字符串加到map裏面,對於每一個新遍歷的字符串就和map比較是否相等。       最開始用map,會出現超時,於是採用hash實現結構的unordered_map就不會超時,在

原创 leetcode C++ 42. 接雨水 給定 n 個非負整數表示每個寬度爲 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。 上面是由數組 [0,1,0,2,1,0,1,3,2,

一、思路:     左邊最高和右邊最高求一個最小值減去當前高度,就等於當前能裝的水的量 二、代碼: class Solution { public: int getMaxRight(vector<int>& height, int i

原创 leetcode C++ 鏈表 24. 兩兩交換鏈表中的節點 給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換

一、思路:     在頭結點前加一個啞結點,遍歷,判斷是否當前節點的後兩個節點是否爲空,爲空交換一次,最後返回啞結點的next 二、C++: class Solution { public: ListNode* swapPairs(

原创 leetcode C++ 25. K 個一組翻轉鏈表 給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。

一、思路:       先實現兩個節點翻轉,再實現k個節點翻轉,最後實現一組一組翻轉 二、C++代碼: class Solution { public: ListNode* swap(ListNode *f1, ListNode

原创 leetcode C++ 39. 組合總和 給定一個無重複元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和爲 target 的組合。 c

一、思路:           DFS深度搜索,直到所有元素都被遍歷。另外如果一組結果的求和大於target,剪枝返回 class Solution { public: vector<vector<int>> combinationS

原创 leetcode C++ 23. 合併K個排序鏈表 合併 k 個排序鏈表,返回合併後的排序鏈表。請分析和描述算法的複雜度。

一、思路:       第一種:求出每一個鏈表的最小值,然後把這個節點放到合併的結果鏈表裏面,這個鏈表指向next       第二種:優先級隊列,頭結點放到優先級隊列裏面,將top的那一個放到合併的鏈表裏面,再講top指向next,pu

原创 leetcode C++ 28. 實現 strStr() 實現 strStr() 函數。 給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 need

一、C++ class Solution { public: int strStr(string haystack, string needle) { if (needle.size() == 0) return 0;

原创 leetcode C++ 46. 全排列 給定一個 沒有重複 數字的序列,返回其所有可能的全排列。

一、思路:        回溯算法,和其它回溯算法區別還蠻大的,這道題遍歷我當時還真沒想到,是借鑑別人的思路 二、C++代碼: class Solution { public: vector<vector<int>>res; ve

原创 C++ leetCode 判斷一個整數是否爲迴文數 9. 迴文數 判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

一、思路:       遍歷到中間位置,如果第i個和第size-i-1個不相等,將不爲迴文數,反之,爲迴文數 bool isPalindrome(int x) { string strX = to_string(x); for (i

原创 C++ leetcode 12. 整數轉羅馬數字 羅馬數字包含以下七種字符: I, V, X, L,C,D 和 M。

一、C++代碼: string intToRoman(int num) { map<int, char> mapRoman = { {1,'I'},{5,'V'},{10,'X'},{50,'L'},{100,'C'}, {500,

原创 C++ leetcode 5. 最長迴文子串 給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。

一、思路      從第二個遍歷到最後一個,然後每次遍歷從中間往兩邊找,這樣可以找到所有的迴文串 string longestPalindrome(string s) { int left; int right; int maxL