来刷刷Grind 75, Blind 75作者更新版.
Leetcode1 两数之和
经典题
link
思路:
- 很明显用hash table,一开始思考遍历2遍数组,第一遍加入hash table中, 第二遍对每个元素看能不能找到
sum == target
,但思考如果有重复元素?不行! - 遍历一遍数组,每次在 table 中都直接找
target - nums[i]
,如果找到了直接 return,否则把nums[i]
加入 table
时间复杂度: O ( n ) O(n) O(n)
当时写的 java 版解答
think 还有什么思路?
sort + two-finger:先排序数组,复杂度 O ( n l o g n ) O(nlogn) O(nlogn),然后用双指针,一前一后遍历数组
这样total 复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int n = nums.size();if (n == 2) {if (nums[0] + nums[1] == target)return {0, 1};}unordered_map<int, int> hash;for (int i = 0; i < n; ++i) {auto t = hash.find(target - nums[i]);if (t != hash.end()) {return {t->second, i};}hash[nums[i]] = i;//hash.insert(make_pair(nums[i], i));}return {};}
};
Leetcode20 有效的括号
括号匹配题
link
思路很简单,不赘述了,详见之前写过的java版代码
时间复杂度: O ( n ) O(n) O(n)
class Solution {
public:bool isValid(string s) {stack<char> stack;for (char x : s) {if (x == '(' || x == '[' || x == '{') {stack.push(x);}else {if (!stack.empty()) {char t = stack.top();if (!check(t, x))return false;elsestack.pop();}elsereturn false;}}if (stack.empty())return true;elsereturn false;}bool check(const char x, const char y) {if (x == '(' && y == ')')return true;else if (x == '[' && y == ']')return true;else if (x == '{' && y == '}')return true;elsereturn false;}
};