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 下次貪心時候也要動動...