class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//利用pair保存下标信息,first为元素值,second参数为原始下标
pair<int,int> temp[nums.size()];
for(int i=0;i<nums.size();i++){
temp[i]={nums[i],i};
}
//排序,以便运用双指针
sort(temp,temp+nums.size());
int left=0,right=nums.size()-1;
while(left<right){
int sum=temp[left].first+temp[right].first;
if(sum==target){
return {temp[left].second,temp[right].second};
}else if(sum>target){
right--; //让sum小一点
}else if(sum<target){
left++; //让sum大一点
}
}
return {-1,-1};
}
};
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0){
return 0;
}
int slow=0,fast=0;
while(fast<nums.size()){
if(nums[fast]!=nums[slow]){
slow++;
//记录不重复元素
nums[slow]=nums[fast];
}
fast++;
}
//数组长度=索引+1
return slow+1;
}
};
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL){
return NULL;
}
ListNode *slow=head,*fast=head;
while(fast!=NULL){
if(fast->val!=slow->val){
// num[slow]=num[fast]
slow->next=fast;
//slow++
slow=slow->next;
}
//fast++
fast=fast->next;
}
//断开与后面重复元素的连接
slow->next=NULL;
return head;
}
};
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0,fast=0;
while(fast<nums.size()){
if(nums[fast]!=val){
//先赋值,再slow++,保证nums[0...slow-1]不包含val
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
};
class Solution {
public:
void moveZeroes(vector<int>& nums) {
//先用双指针移除0,再在末尾补足0
int slow=0,fast=0;
while(fast<nums.size()){
if(nums[fast]!=0){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
for(;slow<nums.size();slow++){
nums[slow]=0;
}
}
};
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int left=0,right=numbers.size()-1;
while(left<right){
int sum=numbers[left]+numbers[right];
if(sum==target){
return {left+1,right+1};
}else if(sum>target){
right--;
}else if(sum<target){
left++;
}
}
return {-1,-1};
}
};
class Solution {
public:
string longestPalindrome(string s) {
string res="";
for(int i=0;i<s.length();i++){
// 以 s[i] 为中心的最长回文子串
string s1=palindrome(s,i,i);
// 以 s[i] 、s[i+1]为中心的最长回文子串
string s2=palindrome(s,i,i+1);
// res = longest(res, s1, s2)
// res=s2;
res=res.length()>s1.length()?res:s1;
res=res.length()>s2.length()?res:s2;
}
return res;
}
//从中心向两端扩散,分奇数偶数讨论,回文串有可能是奇,有可能偶
// 在 s 中寻找以 s[l] 和 s[r] 为中心的最长回文串
// 在 s 中寻找以 s[l] 和 s[r] 为中心的最长回文串
string palindrome(string s, int l, int r) {
// 防止索引越界
while (l >= 0 && r < s.length() && s[l]==s[r]) {
// 双指针,向两边展开
l--; r++;
}
// 返回以 s[l] 和 s[r] 为中心的最长回文串
return s.substr(l + 1, r-1-l);
}
};
class Solution {
public:
string longestPalindrome(string s) {
int n=s.length();
if(n<2) return s;
int m_max=1;
int start=0;
vector<vector<bool>> dp(n,vector<bool>(n));
for(int i=0;i<n;i++){
dp[i][i]=true;
}
for(int j=1;j<n;j++){
for(int i=0;i<j;i++){
if(s[i]!=s[j]){
dp[i][j]=false;
}else{
if(j-i<3)
dp[i][j]=true;
else
dp[i][j]=dp[i+1][j-1];
}
if(dp[i][j] && j-i+1>m_max){
m_max=j-i+1;
start=i;
}
}
}
return s.substr(start,m_max);
}
};