
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
int i = 0;
int j = numbers.size() - 1;
while (i < j) {
int sum = numbers[i] + numbers[j];
if (sum == target) {
return {i + 1, j + 1};
} else if (sum > target) {
j--;
} else {
i++;
}
}
return {};
}
};

class Solution {
public:
bool judgeSquareSum(int c) {
long j = (int) sqrt(c);
long i = 0;
while (i <= j) {
long sum = i * i + j * j;
if (sum == c) {
return true;
} else if (sum > c) {
j--;
} else {
i++;
}
}
return false;
}
};

#define vowels(a)((a == 'a')||( a=='o')|| (a=='e')|| (a=='i')|| (a=='u')||(a == 'A')||( a=='O')|| (a=='E')|| (a=='I')|| (a=='U'))
class Solution {
public:
string reverseVowels(string s) {
if (s == "") {
return s;
}
int size = s.length();
for (int l = 0, r = size - 1; l <= r;) {
while (l <= r && vowels(s[l]) == false) l++;
while (l <= r && vowels(s[r]) == false) r--;
if (l > r) {
return s;
}
swap(s[l], s[r]);
l++, r--;
}
return s;
}
};

class Solution {
public:
bool Judgehuiwen(int left, int right, string &str) {
if (left == right) {
return true;
}
while (left < right) {
if (str[left] != str[right]) {
return false;
break;
} else {
left++;
right--;
}
}
return true;
}
bool validPalindrome(string s) {
if (s.size() == 1) {
return true;
}
int left = 0;
int right = s.size() - 1;
while (left < right) {
if (s[left] != s[right]) {
return (Judgehuiwen(left + 1, right, s)) || (Judgehuiwen(left, right - 1, s));
} else {
left++;
right--;
}
}
return true;
}
};
//!!如果存在将光标点不同的字母和字符可以从左边或右边的游标被删除的情况下,你的算法将只检查从左侧删除。 如果回文是通过从右侧删除而形成的,则您的代码将丢失它。
因此,如果从左侧删除,则还需要检查是否可以从右侧删除,并且(可能)从左侧删除时检查是否没有回文。

class Solution {
public:
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n) {
if (m == 0) {
swap(nums1, nums2);
return;
}
int a = m - 1;
int b = n - 1;
int c = m + n - 1;
while (a >= 0 && b >= 0) {
nums1[c--] = (nums1[a] > nums2[b]) ? nums1[a--] : nums2[b--];
}
while (b >= 0) {
nums1[c--] = nums2[b--];
}
return;
}
};

class Solution {
public:
int findContentChildren(vector<int> &g, vector<int> &s) {
if (g.empty() || s.empty()) {
return 0;
}
int i = 0;
int j = 0;
int m = s.size();
int n = g.size();
int ans = 0;
sort(g.begin(), g.end());
sort(s.begin(), s.end());
while (i < n && j < m) {
if (g[i] <= s[j]) {
ans++;
i++;
j++;
} else {
j++;
}
}
return ans;
}
};

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
if (head == NULL) {
return false;
}
ListNode *l1 = head;
ListNode *l2 = head->next;
while (l1 != NULL && l2->next != NULL && l2 != NULL) {
if (l1 == l2) {
return true;
}
l1 = l1->next;
l2 = l2->next->next;
}
return false;
}
};

class Solution {
public:
string findLongestWord(string s, vector <string> &d) {
vector <string> a;
for (auto x:d) {
int j = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == x[j]) j++;
}
if (j == x.size()) a.push_back(x);
}
sort(a.begin(), a.end(), [](auto a, auto b) {
return a.size() > b.size() || a.size() == b.size() && a < b;
});
return a.size() > 0 ? a[0] : "";
}
};

class Solution {
public:
void sortColors(vector<int>& nums) {
int p1=0,curr=0;
int p2=nums.size()-1;
while(curr<=p2)
{
if(nums[curr]==0)
{
swap(nums[curr++],nums[p1++]);
}
else if(nums[curr]==2)
{
swap(nums[curr],nums[p2--]);
}
else{
curr++;
}
}
}
};