0%

LeetCode-Day4

14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

1
2
输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

1
2
3
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明:

所有输入只包含小写字母 a-z 。

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";
for(int j = 0; j<strs[0].size(); j++)
for(int i = 0; i<strs.size(); i++)
if(j>strs[i].size() || strs[0][j] != strs[i][j])
return strs[i].substr(0,j);
return strs[0];
}
};

解释:

如果strs的长度为0,直接返回“”

然后同时遍历每个字母的第一个字符,第二个字符…直到遇到不相等的就直接返回。

15. 三数之和

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

1
2
3
4
5
6
7
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

解题方案:

  • 首先对数组进行排序, 排序后固定一个数nums[i],再使用左右指针指向nums[i]后面的两端,数字分别为nums[L]和nums[R], 计算三个数的和sum,判断是否满足为0,满足则添加进结果集
  • 如果nums[i] 大于0,则三数之和必然无法等于0,结束循环
  • 如果nums[i] == nums[i - 1],则说明该数字重复,会导致结果重复,所以应该跳过
  • 当sum == 0时,nums[L] == nums[L + 1]则会导致结果重复,应该跳过,L++
  • 当sum == 0时,nums[R] == nums[R - 1]时会导致结果重复,应该跳过,R–
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
30
31
32
33
34
35
36
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int> > ans;
for (int i = 0;i < nums.size() && nums[i] <= 0;i++) {
if(i == 0 || nums[i] > nums[i - 1]) {
int l = i + 1;
int r = nums.size() - 1;
while(l < r) {
int sum = nums[i] + nums[l] + nums[r];
if(sum == 0) {
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[l]);
temp.push_back(nums[r]);
ans.push_back(temp);
l += 1;
r -= 1;
while(l < r && nums[l] == nums[l - 1]) {
l++;
}
while(l < r && nums[r] == nums[r + 1]) {
r--;
}
} else if(sum < 0) {
l++;
} else {
r--;
}
}
}
}
return ans;
}
};