力扣部分刷題記錄

2022-06-29 15:51:08 字數 4370 閱讀 6450

1. 兩數之和

思路:

暴力遍歷
**:

class solution }}

vectorres;

return res;

}};

2. 兩數相加

思路:

遍歷鍊錶
**:

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

if(c)

return res->next;

}};

3. 無重複字元的最長子串

思路:

暴力:

列舉每乙個字元,當做當前子串的頭,依次遍歷下去,直到不合格。

那麼顯然是要超時的,在暴力的基礎做乙個小優化即可:

**:

class solution  else

}return max(res, cur);

}};

4. 尋找兩個正序陣列的中位數

思路:

二分。

分奇偶來討論,每次尋找兩個陣列中第(k / 2 - 1) 個元素,很明顯小的那個不符合要求,所以他前面的包括他都可以刪去,用指標來實現。特判特殊情況即可。

**:

class solution  else}}

double findmediansortedarrays(vector& nums1, vector& nums2)

};

5. 最長回文子串

思路:

用manacher演算法求出最長回文串的長度和其中心的下標即可。
**:

class solution 

if(maxlen < p[i] - 1)

}return ;

}string longestpalindrome(string s)

str[ ++ lenstr] = '~';

pairans = manacher(str, lenstr);

int a = ans.first;

int b = ans.second;

cout << a << " " << b << endl;

string res = "";

for(int i = b - a + 1; i < b + a; i ++)

return res;

}};

6. z 字形變換

思路:

找規律。

設 m = 2 * numrows - 2;

那麼遍歷去 % m 很容易發現規律

**:

class solution 

for(int i = 0; i < tmp.size(); i ++)

res += tmp[i];

return res;

}};

7. 整數反轉

思路:

注意溢位
**:

class solution 

while(x)

if(mark) res *= -1;

if(res > mx || res < mn) res = 0;

return int(res);

}};

8. 字串轉換整數 (atoi)

思路:

模擬即可
**:

class solution 

}if(s.empty()) return 0;

long long num = 0;

for(int i = 0; i < s.size(); i ++)

if(symbol == -1) num *= -1;

if(num > int_max) num = int_max;

if(num < int_min) num = int_min;

return int(num);

return 0;

}};

9. 回文數

思路:

暴力
**:

class solution 

return y == tmp;

}};

10. 正規表示式匹配

思路:

二維dp

設f[i][j]: s中前i個字元與p中前j個字元是否合法匹配

1. p[j] = '*':

f[i][j] |= f[i][j - 2] // 將j-1刪去

if(p[j - 1] == s[i]) f[i][j] |= f[i - 1][j]

2. p[j] != '*':

if(p[j] == '.' || p[j] == s[i]) f[i][j] |= f[i - 1][j - 1]

return f[size(s)][size(p)]

**:

class solution ;

int f[ls + 10][lp + 10];

memset(f, 0, sizeof f);

f[0][0] = true;

for(int i = 0; i <= ls; i ++)

for(int j = 1; j <= lp; j ++) else

}return f[ls][lp];

}};

11. 盛最多水的容器

思路:

雙指標

很顯然的乙個事實是:高度取決於短的板子

我們可以逐漸縮小寬度來獲得更高的高度

// 當h[i] < h[j]時,i++, 那麼高度是有可能變大的,如果是j--,那麼高度只可能更小,並且由於寬度還變小了,那麼j--一定不會是最優解。

if h[i] < h[j]:

i ++;

else j --;

**:

class solution 

return res;

}};

12. 整數轉羅馬數字

思路:

把羅馬字元可以代表的字元都手動預處理下來,共計13項,然後從大到小遍歷即可。
**:

string rome = ;

int val = ;

class solution

}return res;

}};

13. 羅馬數字轉整數

思路:

用hash對映出羅馬字母對應的數,然後從左往右遍歷一遍,如果當前值小於左邊就減,反之就加。(注意處理邊界)
**:

class solution 

res += mp[s[n - 1]];

return res;

}};

14. 最長公共字首

思路:

暴力
**:

class solution 

string longestcommonprefix(vector& strs)

if(mark) res += c;

else break;

}return res;

}};

51. n 皇后

思路:

dfs列舉
**:

class solution 

vectorrecord(int pos, int n)

return res;

}void queen(int i, int *pos, int n, vector> & res)}}

vector> solvenqueens(int n)

};

216. 組合總和 iii

思路:

dfs 暴力列舉
**:

class solution 

if(num > 9 || sum > b || cnt > a) return;

for(int i = num; i <= 9; i ++)

}vector> combinationsum3(int k, int n)

};

力扣刷題記錄05

題目分類 二分查詢 時間 2020 09 09 題目一 兩數之和 兩數之和 ii 輸入有序陣列 給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。說明 返回的下標值 ind...

力扣刷題記錄2

第一題是每日一題的簡單題。需要記的並不多,一是用迭代器對vector的一些基本操作。可以參考這裡 for vector iterator iter num.begin iter num.end iter 另外是快排的思想。這種思想實用性很廣,即使不需要排序,在找出最大的k個數,對陣列進行分割 以中間...

力扣刷題記錄10

三角形的最大周長 看到這個題目,我想到了排序後從最大的中挑選,但遇到了點困難,一方面是無法記錄哪個是最大的點,這樣每次都要判斷。另一方面是根據題目要求,每個數只能用一次,要記錄下當前哪些是已經被使用了的。看到題解之後感覺自己是個智障。class solution return0 下次貪心時候也要動動...