這周繼續刷陣列類的演算法題~
給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。
示例 1:
輸入: "a man, a plan, a canal: panama"
輸出: true
說明:本題中,我們將空字串定義為有效的回文串。
class
solution
return
true;}
bool
is_char
(char c)
bool
equal_character
(char c1,
char c2)if(
(c2 >=
'a')
&&(c2 <=
'z'))if
(c1 == c2)
return
true
;else
return
false;}
};
複雜度分析時間複雜度:o(n),只掃瞄一遍。
空間複雜度:o(1),無需額外空間。
給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。
函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。
說明:返回的下標值(index1 和 index2)是從1開始計數的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。
示例 1:
輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等於目標數 9 。因此 index1 = 1, index2 = 2 。
解法
class
solution;}
if((numbers[i]
+ numbers[j]
)< target)if(
(numbers[i]
+ numbers[j]
)> target)
}return;}
};
複雜度分析時間複雜度:o(n),只需掃瞄一遍陣列。
空間複雜度:o(1),無需額外空間。
編寫乙個函式,其作用是將輸入的字串反轉過來。輸入字串以字元陣列 char 的形式給出。
不要給另外的陣列分配額外的空間,你必須原地修改輸入陣列、使用 o(1) 的額外空間解決這一問題。
你可以假設陣列中的所有字元都是 ascii 碼表中的可列印字元。
示例 1:
輸入:["h","e","l","l","o"]
輸出:["o","l","l","e","h"]
class
solution}}
;
複雜度分析空間複雜度:o(1),無需額外空間。
時間複雜度:o(n),只需掃瞄一遍陣列。
編寫乙個函式,以字串作為輸入,反轉該字串中的母音字母。
示例 1:
輸入: "hello"
輸出: "holle"
跳過字串中非母音字元
class
solution
return s;
}bool
is_vowel
(char ch)
else
return
false;}
};
複雜度分析空間複雜度:o(1),無需額外空間。
時間複雜度:o(n),只需掃瞄一遍字串。
給定 n 個非負整數 a1,a2,…,an,每個數代表座標中的乙個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
說明:你不能傾斜容器,且 n 的值至少為 2。
圖中垂直線代表輸入陣列 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。
示例 1:
輸入: [1,8,6,2,5,4,8,3,7]
輸出: 49
利用容器容量由短板決定,每次將短板向中間移動
class
solution
else max_water = height[front_ptr]
*(end_ptr - front_ptr)
;while
(front_ptr < end_ptr)
--end_ptr;}}
else
++front_ptr;}}
}return max_water;}}
;
複雜度分析空間複雜度:o(1),無需額外空間。
時間複雜度:o(n),只需掃瞄一遍字串。
給定乙個含有 n 個正整數的陣列和乙個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的連續子陣列。如果不存在符合條件的連續子陣列,返回 0。
示例 1:
輸入: s = 7, nums = [2,3,1,2,4,3]
輸出: 2
解釋: 子陣列 [4,3] 是該條件下的長度最小的連續子陣列。
class
solution
else
++second_ptr;}if
(sum_int >= s &&
(first_ptr < nums.
size()
))sum_int -
= nums[first_ptr]
;++first_ptr;}}
return min_len;}}
;
複雜度分析空間複雜度:o(1),無需額外空間。
時間複雜度:o(n),只需掃瞄一遍字串。
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是
「abc」,所以其長度為 3
利用雙索引法中的滑動視窗法,視窗內出現重複字元時向右滑動左視窗(減小視窗),視窗中無重複字元時向右滑動右視窗(增大視窗)
當我們知道該字符集比較小的時侯,我們可以用乙個整數陣列作為直接訪問表來替換 map。
常用的表如下所示:
int [26] 用於字母 『a』 -『z』 或 『a』 - 『z』
int [128] 用於ascii碼
int [256] 用於擴充套件ascii碼
class
solution
;//利用256長度的陣列儲存字串內出現過的字元資訊
int first =
0, second =0;
//滑動視窗法s[first,second]內為最長子串
char_freq[s[second]]=
1;int sub_length =1;
char new_char;
if(s.
size()
==0)return0;
while
(first < s.
size()
)}while
(s[first]
!= new_char)
++first;
}return sub_length;}}
;
複雜度分析空間複雜度:o(1),無需額外空間。
時間複雜度:o(n),只需掃瞄一遍字串。
《演算法筆記》Dijkstra演算法筆記
今日在華農終於接近完成閱讀演算法筆記,有點點成就感,做下dijkstra跟dfs演算法結合的筆記 簡單狀態 純dijkstra include include include define inf 1000000000 using namespace std const int maxn 1010 ...
回溯 皇后 演算法筆記 演算法筆記
分治演算法 線性時間選擇 o n 33 隨機線性選擇 偽 o n int partition type a,int p,int r return table n 1 w 1 main function else else lowcost i 0 for int i 1 i n i int temp ...
回溯 皇后 演算法筆記 演算法筆記
遞迴演算法 能夠用遞迴解決的問題需要滿足三個條件 原問題可以轉換為乙個或多個子問題來求解,而這些子問題的求解方法和原問題完全相同,只是規模不同 遞迴呼叫次數必須是有限的 必須有結束遞迴的條件 遞迴出口 來終止遞迴。設計遞迴演算法模式先求解問題的遞迴模型。在設計遞迴演算法的時候,如果糾結遞迴樹的每乙個...