classSolution {
public:
intmaxArea(vector<int>& height){
int left = 0;
int right = height.size() - 1;
int ret = 0;
while (left < right) {
int v = min(height[left], height[right]) * (right - left);
ret = max(ret, v);
if (height[left] < height[right]) {
++left;
} else {
--right;
}
}
return ret;
}
};
classSolution {
public:
string longestCommonPrefix(vector<string>& strs){
string ret = strs[0];
for (int i = 1; i < strs.size(); i++) {
ret = findCommon(ret, strs[i]);
}
return ret;
}
string findCommon(string& s1, string& s2){
int i = 0;
while (i < min(s1.size(), s2.size()) && s1[i] == s2[i]) {
i++;
}
return s1.substr(0, i);
}
};
方法二:纵向扫描
classSolution {
public:
string longestCommonPrefix(vector<string>& strs){
if (strs.empty()) return"";
int length = strs[0].size();
int count = strs.size();
for (int i = 0; i < length; i++) {
char c = strs[0][i];
for (int j = 1; j < count; j++) {
if (i == strs[j].size() || strs[j][i] != c) {
return strs[0].substr(0, i);
}
}
}
return strs[0];
}
};
方法三:分治
classSolution {
public:
string longestCommonPrefix(vector<string>& strs){
if (strs.empty()) return"";
returnlongestCommonPrefix(strs, 0, strs.size() - 1);
}
string longestCommonPrefix(const vector<string>& strs, int start, int end){
if (start == end) return strs[start];
int mid = (start + end) / 2;
string lcpLeft = longestCommonPrefix(strs, start, mid);
string lcpRight = longestCommonPrefix(strs, mid + 1, end);
returncommonPrefix(lcpLeft, lcpRight);
}
string commonPrefix(const string& lcpLeft, const string& lcpRight){
int minLength = min(lcpLeft.size(), lcpRight.size());
for (int i = 0; i < minLength; i++) {
if (lcpLeft[i] != lcpRight[i]) {
return lcpLeft.substr(0, i);
}
}
return lcpLeft.substr(0, minLength);
}
};
方法四:排序
classSolution {
public:
string longestCommonPrefix(vector<string>& strs){
if (strs.empty()) return"";
sort(strs.begin(), strs.end());
string start = strs.front();
string end = strs.back();
int n = min(start.size(), end.size());
int i = 0;
for (; i < n && start[i] == end[i]; i++);
return start.substr(0, i);
}
};
classSolution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> ret;
int n = nums.size();
for (int i = 0; i < n; ++i) {
if (nums[i] > 0) break;
int left = i + 1;
int right = n - 1;
int target = -nums[i];
while (left < right) {
int sum = nums[left] + nums[right];
if (sum > target) {
--right;
} elseif (sum < target) {
++left;
} else {
ret.push_back({nums[i], nums[left], nums[right]});
++left;
--right;
while (left < right && nums[left] == nums[left - 1]) ++left;
while (left < right && nums[right] == nums[right + 1]) --right;
}
}
while (i < n - 1 && nums[i] == nums[i + 1]) ++i;
}
return ret;
}
};
classSolution {
public:
intthreeSumClosest(vector<int>& nums, int target){
sort(nums.begin(), nums.end());
int n = nums.size();
int ret = 1e7;
auto update = [&](int cur) {
if (abs(cur - target) < abs(ret - target)) {
ret = cur;
}
};
for (int i = 0; i < n; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
int left = i + 1, right = n - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == target) return target;
update(sum);
if (sum > target) {
right--;
while (left < right && nums[right] == nums[right + 1]) right--;
} else {
left++;
while (left < right && nums[left] == nums[left - 1]) left++;
}
}
}
return ret;
}
};