0%

LeetCode-Day15

49. 字母异位词分组

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

1
2
3
4
5
6
7
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]

说明:

所有输入均为小写字母。
不考虑答案输出的顺序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> hashmap;
for(auto s : strs){
string temp = s;
sort(temp.begin(), temp.end());
hashmap[temp].push_back(s);
}
int len = hashmap.size();
vector<vector<string>> ans(len);
int index = 0;
for(auto i : hashmap){
ans[index] = i.second;
++ index;
}
return ans;
}
};

解释:该题目的难点就在于如何将异位词对应于一个标签,这个时候就用到了sort,将每一个单词按照从小到大排序完,对应于map的key,然后如果出现异位词时,则他们的标签是一样的(即单词排完序之后是一样的)。

54. 螺旋矩阵

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

1
2
3
4
5
6
7
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2:

1
2
3
4
5
6
7
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
if(matrix.empty()) {
return ans;
}
int u = 0, d = matrix.size() - 1, l = 0, r = matrix[0].size() - 1;
while(true) {
for(int i = l;i <= r;++i) {
ans.push_back(matrix[u][i]);
}
if(++u > d) break;
for(int i = u;i <= d;++i) {
ans.push_back(matrix[i][r]);
}
if(--r < l) break;
for(int i = r;i >= l;--i) {
ans.push_back(matrix[d][i]);
}
if(--d < u) break;
for(int i = d;i >= u;--i) {
ans.push_back(matrix[i][l]);
}
if(++l > r) break;
}
return ans;
}
};

解释:

这里的方法不需要记录已经走过的路径,所以执行用时和内存消耗都相对较小

  • 首先设定上下左右边界
  • 其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界
  • 判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案
  • 若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理
  • 不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案

55. 跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

1
2
3
输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。

示例 2:

1
2
3
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
bool canJump(vector<int>& nums) {
int n = nums.size();
int last = n - 1;
for(int i = n - 1; i >= 0; --i){
if(i + nums[i] >= last){
last = i;
}
}
return !last;
}
};

贪心算法:

从最后一个位置开始,然后看前面的位置能否跳到当前位置及其后面,如果可以,就将最后的位置往前移动。