演算法筆記 12 16 12 22

2021-10-01 11:59:39 字數 4201 閱讀 2525

這周繼續刷陣列類的演算法題~

給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。

示例 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 ...

回溯 皇后 演算法筆記 演算法筆記

遞迴演算法 能夠用遞迴解決的問題需要滿足三個條件 原問題可以轉換為乙個或多個子問題來求解,而這些子問題的求解方法和原問題完全相同,只是規模不同 遞迴呼叫次數必須是有限的 必須有結束遞迴的條件 遞迴出口 來終止遞迴。設計遞迴演算法模式先求解問題的遞迴模型。在設計遞迴演算法的時候,如果糾結遞迴樹的每乙個...