来刷刷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;
else
stack.pop();
}
else
return false;
}
}
if (stack.empty())
return true;
else
return 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;
else
return false;
}
};