LC148:排序链表:
思考,对链表的排序,一定需要从前向后进行遍历。同时又由于数据太大,需要降到o(n²)下,所以本题最好选用快速排序和归并排序。
快速排序:
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(head==nullptr||head->next==nullptr)return head;
int l=head->val,m=head->val,z;
ListNode*p=head,*p1=nullptr,*p2=nullptr;
while(p){l=min(l,p->val),m=max(m,p->val),p=p->next;}
if(l==m)return head;
z=(l+m)>>1;
p=head;
ListNode*q;
while(p){
q=p->next;
if(p->val<=z){
p->next=p1;
p1=p;
}
else{
p->next=p2;
p2=p;
}
p=q;
}
p1=sortList(p1);p2=sortList(p2);
p=p1;
while(p->next)p=p->next;
p->next=p2;
return p1;
}
};
LC219:存在重复元素:
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
int n=nums.size();
vector<int>ind(n);
for(int i=0;i<n;i++)ind[i]=i;
sort(ind.begin(),ind.end(),[&](int i,int j)->bool{return nums[i]<nums[j];});
int j=0;
while(j<=n-2){
if(abs(ind[j]-ind[j+1])<=k)return true;
}
return false;
}
};
注意sort函数那里,[&](int i,int j)->bool应该指的是一个返回bool类型的函数,所以也可以
bool{if(nums[i]!=num[j] return nums[i]-nums[j];return i-j;}
这样可以省去abs函数的使用。