無重複字元的最長子串
給定乙個字串,找出不含有重複字元的最長子串的長度。 示例: 給定 "abcabcbb" ,沒有重複字元的最長子串是 "abc" ,那麼長度就是3。 給定 "bbbbb" ,最長的子串就是 "b" ,長度是1。 給定 "pwwkew" ,最長子串是 "wke" ,長度是3。請注意答案必須是乙個子串,"pwke" 是 子串行 而不是子串。
分析思路:**如下:暴力法:取出所有的子串,校驗沒有重複的最大值,顯然這種演算法是有很多重複操作的。比如遍歷abc的時候已經知道abc沒有重複,後面沒必要再進行這段的比對。
使用滑動視窗,初始視窗左值為0,右值為1,右值開始遍歷字串每個字元的同時,存入hash表,如果hash表中已經有了改字元的索引,那麼久移動視窗的左值為該位置的下乙個位置,繼續滑動視窗,直到遍歷完字串,思路並不算複雜。時間複雜度和空間複雜度都是o(n)
class solution
int left = 0,right =1, string_length = s.size(),max_length = 0;
unordered_maphashmap;
hashmap[s[left]] = left;
max_length = 1;
while (right < string_length)
else
max_length = max(max_length,right -left+1);
right++;
}return max_length;
}};複製**
兩個排序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 。 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o(log (m+n)) 。 示例 1: nums1 = [1, 3] nums2 = [2] 中位數是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 中位數是 (2 + 3)/2 = 2.5
分析核心思路,中位數的數學定義就是該位置左邊的數和右邊的數數量一致。我們抽象s1陣列存在位置i,s2的陣列存在位置j,s1的陣列i左邊的數加上s2陣列j左邊的數正好是兩個陣列總長度的一半。這樣i和j就存在數學關係i+j= (m+n)/2。我們同時假設n是大於等於m的。這樣我們再s1陣列中搜尋位置i,j的位置根據數學關係也是對應的,採用二分法搜尋合適i的位置保證時間複雜度要求到o(log (m+n))**如下
class solution
//先確定好i的值和中值
int imin = 0,imax = m,halflen = (m+n+1)/2;
//開始遍歷
while (imin
<= imax)
else
if (i > imin && nums1[i-1] >nums2[j])
else
else
if(j == 0)
else
//奇數直接return左邊邊界值
if ( (m + n) % 2 == 1 )
int minright = 0;
if (i == m)
else
if (j == n)
else
return (maxleft + minright) / 2.0;}}
return 0.0f;
}};複製**
程式設計師演算法練習四
給定乙個 32 位有符號整數,將整數中的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 注意 假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 231,231 1 根據這個假設,如果反轉後的整數溢位,則返回 0。常...
黑馬程式設計師 for練習
namespace for練習 console.writeline sum console.readkey 2 找出100 999間所有水仙花數 水仙花是乙個三位數,每一位數的立方相加等於該數本身 static void main string args console.readkey 3 分解乙個...
練習聊天程式設計師
using system using system.collections.generic using system.linq using system.text namespace 練習聊天機械人 class program static void main string args 機械人 r1 ...