编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
思路比较简单,以此一个字符为基准,依次比较
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
//依次遍历每个字符串
string compareStr = strs[0];
for(int k = 1; k<strs.size(); k++)
{
string str = strs[k];
if(compareStr.size() == 0)
{
return "";
}
int i = 0;
int j = 0;
while(i<str.size() && j<compareStr.size() && (str[i] == compareStr[j]))
{
i++;
j++;
}
compareStr = compareStr.substr(0, i);//需要一个接受值 否则compare不变的
cout<<"compareStr"<<compareStr;
}
return compareStr;
}
};
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
第一反应考虑之前做过地两数之和,用哈希表,但题目要求结果不能有重复元素,而且两数之和返回下标,三数之和返回数据,做法不尽相同。
也很容易考虑三重循环去判断结果,同样由于重复元素,考虑排序,将元素递增排序,将第二重循环与第三重循环通过双指针合并到一个循环中,第二个元素递增,第三个元素递减,当相加大于X时,第三个左移,当相加小于X时,第二个右移;全程跳过重复元素
尝试编写代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> res;
for(int first = 0; first <nums.size(); first++)
{
// if(num[first] == num[first++])
if(first>0 && nums[first] == nums[first-1])//是当前的元素和上一个元素相同 这个元素就pass 不要和下一个元素比较
{
continue;
}
int third = nums.size()-1;
int target = -nums[first];
for(int second = first+1; second<nums.size(); second++)
{
if(second>first+1 && nums[second] == nums[second-1])
{
continue;
}
while(second<third && nums[second]+nums[third] > target)//注意边界 大了3左移 小了不用判断 会从下一个循环second = first+1
{
third--;
}
if(second == third)
break;
if(nums[second]+ nums[third] == target)
{
res.push_back({nums[first],nums[second], nums[third]});
}
}
}
return res;
}
};
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
跟上一题一样的思路 排序 加双指针 只是多维护一个最小绝对值
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int min_res = INT_MAX;//与target求差绝对值最小
int res;
for (int i = 0; i < nums.size()-2; ++i) {
int left = i + 1;
int right = nums.size() - 1;
while (left < right)
{
if (min_res > abs(nums[i] + nums[left] + nums[right] - target)) {
res = nums[i] + nums[left] + nums[right];
min_res = abs(res - target);
}
if (nums[i] + nums[left] + nums[right] > target) right--;
else if (nums[i] + nums[left] + nums[right] < target) left++;
else break;
}
}
return res;
}
};