4Sum:只需要在上一题的基础上外层在加一层遍历的循环即可
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
int len =num.size();
vector <vector<int> >ans;
ans.clear();
//cout<<len<<endl;
sort(num.begin(),num.end());
for(int x=0;x<len;x++){
if(x > 0 && num[x]==num[x-1])
continue;
for(int i=x+1;i<len;i++){
if(i > x+1 && num[i]==num[i-1])
continue;
int k=len-1;
for(int j=i+1;j<k;){
if((j>i+1)&&num[j-1]==num[j]){j++;continue;}
if(k<num.size()-1&& num[k]==num[k+1]){
k--;continue;
}
int sum=num[i]+num[j]+num[k]+num[x];
if(sum>target)k--;
else if(sum<target)j++;
else{
vector<int >s;
s.push_back(num[x]);
s.push_back(num[i]);
s.push_back(num[j]);
s.push_back(num[k]);
if(ans.empty()||ans[ans.size()-1][0]!=s[0]||ans[ans.size()-1][1]!=s[1]||ans[ans.size()-1][2]!=s[2])
ans.push_back(s);
j++;
}
}
}
}
return ans;
}
Letter Combinations of a Phone Number
使用递归的方式遍历即可
void myf(int len,string s,string t,vector< string > &ans){
string ss[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
if(len==s.size()) {ans.push_back(t);return;}
for(int i=0;i<ss[s[len]-'0'].size();i++){
myf(len+1,s,t+ss[s[len]-'0'][i],ans);
}
}
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string>ans;
if (digits.size()==0){ans.push_back("");return ans;}
myf(0,digits,"",ans);
return ans;
}
};
removeNthFromEnd 设两个指针,距离N个节点,这样,就可以删除后一个节点的next即可,但是,这题需要注意,当节点数与要删除的数目等同时,要单独考虑,直接删去第一个元素即可。
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
ListNode *l=head;
//if(head->next==NULL)head=NULL;
ListNode *r=head;
for(int i=0;i<n;i++){
r=r->next;
}
if(r==NULL){head=head->next;return head;}
while(r->next!=NULL){
r=r->next;
l=l->next;
}
l->next=l->next->next;
return head;
}
};