目录
LeetCode 167 两数之和 II - 输入有序数组
解法1:暴力 该方法超时
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
//方法1:暴力法
int n=numbers.size();
int i=0;
int j=0;
vector<int > res;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(numbers[i]+numbers[j]==target)
{
res.push_back(i+1);
res.push_back(j+1);
break;
}
}
}
return res;
}
};
解法2:二分查找
class Solution {
public:
//在numbers[l...r]中找target
//找到返回下标,找不到返回0
int binarysearch(vector<int>& numbers,int l,int r,int target)
{
while(l<=r)
{
int mid=l+(r-l)/2;
if(numbers[mid]==target)
{
return mid;
}
else if(numbers[mid]<target)
{
l=mid+1;
}
else if(numbers[mid]>target)
{
r=mid-1;
}
}
return 0;
}
vector<int> twoSum(vector<int>& numbers, int target) {
//方法2:二分查找法
int n=numbers.size();
int i=0;
vector<int> res;
for(i=0;i<n;i++)
{
//在剩下不部分找target-numbers[i]
int ret=binarysearch(numbers,i+1,n-1,target-numbers[i]);
if(ret!=0)
{
res.push_back(i+1);
res.push_back(ret+1);
}
}
return res;
}
};
解法3:对撞指针
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int l=0;
int r=numbers.size()-1;
vector<int> res;
while(l<r)
{
if(numbers[l]+numbers[r]==target)
{
res.push_back(l+1);
res.push_back(r+1);
break;
}
else if(numbers[l]+numbers[r]<target)
{
l++;
}
else if(numbers[l]+numbers[r]>target)
{
r--;
}
}
return res;
}
};
LeetCode 125 验证回文串
方法1:筛选+翻转判断:
/*
int isalnum(int c);
作用:判断字符c是否是字母或数字
返回值:
0,不是字母和数字
非0,是字母和数字
int tolower(int c);
作用:将c转换成小写
返回值:转换后的字符
*/
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (char ch: s) {
if (isalnum(ch)) {
sgood += tolower(ch);
}
}
string sgood_rev(sgood.rbegin(), sgood.rend());
return sgood == sgood_rev;
}
};
方法2:筛选+对撞指针判断:
class Solution {
public:
bool isPalindrome(string s) {
string s1;
for(auto i:s)
{
if(isalnum(i))
s1+=tolower(i);
}
//用对撞指针判断
int i=0;
int j=s1.size()-1;
while(i<j)
{
if(s1[i]!=s1[j])
{
return false;
}
else
{
i++;
j--;
}
}
return true;
}
};
方法3:在原字符串上直接判断:
class Solution {
public:
bool isPalindrome(string s) {
int n = s.size();
int left = 0, right = n - 1;
while (left < right) {
//从左往右找是字母或数字的字符
while (left < right && !isalnum(s[left])) {
++left;
}
//从右往左找是字母或数字的字符
while (left < right && !isalnum(s[right])) {
--right;
}
//表示还没有判断完
if (left < right) {
//如果两者不等,就说明不是回文,返回false
if (tolower(s[left]) != tolower(s[right])) {
return false;
}
++left;
--right;
}
}
return true;
}
};
LeetCode 344 反转字符串
方法1:对撞指针,互相交换
class Solution {
public:
void reverseString(vector<char>& s) {
int n=s.size();
int i=0;
int j=n-1;
while(i<j)
{
swap(s[i],s[j]);
i++;
j--;
}
}
};
方法2:递归
class Solution {
public:
void reverseString(vector<char>& s) {
int n=s.size();
if(n<2)
return ;
int l=0;
int r=n-1;
reverses(s,l,r);
}
void reverses(vector<char>&s,int l,int r)
{
if(l>=r)
return;
swap(s[l],s[r]);
reverses(s,++l,--r);
}
};
LeetCode 345 反转字符串中的元音字母
方法1:
class Solution {
public:
//判断字符c是否是元音字母,是的话返回true,否则返回false
bool isv(int c)
{
if(c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || c=='A' || c=='E' || c=='I' || c=='O' || c=='U' )
return true;
return false;
}
string reverseVowels(string s) {
int n=s.size();
int i=0;
int j=n-1;
while(i<j)
{
while(i<j&& !isv(s[i]))
{
i++;
}
while(i<j&& !isv(s[j]))
{
j--;
}
if(i<j)
{
swap(s[i],s[j]); //交换两个元音字母
i++;
j--;
}
}
return s;
}
};
方法2:
class Solution {
private:
set<char> dict={'a','o','e','i','u','A','O','E','I','U'};
public:
// 题解:首尾指针,类比快排代码
string reverseVowels(string& s) {
int i=0,j=s.size()-1;
while(i<j)
{
while(!dict.count(s[i])&&i<j)i++;
while(!dict.count(s[j])&&i<j)j--;
if(i<j)swap(s[i++],s[j--]);
}
return s;
}
};
LeetCode 11盛最多水的容器
方法1:对撞指针,哪边低移动哪边
class Solution {
public:
int maxArea(vector<int>& height) {
int l = 0, r = height.size() - 1;
int ans = 0;
while (l < r) {
int area = min(height[l], height[r]) * (r - l);
ans = max(ans, area);
if (height[l] <= height[r]) {
++l;
}
else {
--r;
}
}
return ans;
}
};