Leetcode学习计划-算法入门第2天
主题是双指针
一道简单题一道中等题。
题目977:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
此题目主要有两种解法,一种是将数组平方后再排序,另一种解法是双指针。
第一种解法:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int>nums_cp;
for(auto it=nums.begin();it!=nums.end();it++){
nums_cp.push_back(pow(*it,2));
}
//使用c++内置的排序函数
sort(nums_cp.begin(),nums_cp.end());
return nums_cp;
}
};
顺便把快速排序练习下:
class Solution {
void quicksort(vector<int>& nums,int first,int last){
if(first>=last)return;
int low=first,high=last,pivot=nums[first];
while(low<high){
while(low<high&&nums[high]>=pivot){
high--;
}
nums[low]=nums[high];
while(low<high&&nums[low]<=pivot){
low++;
}
nums[high]=nums[low];
}
nums[low]=pivot;
quicksort(nums,first,low-1);
quicksort(nums,low+1,last);
}
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int>nums_cp;
for(auto num:nums){
nums_cp.push_back(num*num);
}
quicksort(nums_cp,0,nums_cp.size()-1);
return nums_cp;
}
};
第二种解法双指针法
此处用Python写一下子
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
left,right,pos=0,len(nums)-1,len(nums)-1
ans=[0]*len(nums)
while left<=right:
if nums[left]*nums[left]<nums[right]*nums[right]:
ans[pos]=nums[right]*nums[right]
right-=1
else:
ans[pos]=nums[left]*nums[left]
left+=1
pos-=1
return ans
题目189:给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
找到里边唯一能说是双指针的方法
class Solution {
void reverse(vector<int>&nums,int start,int end){
while(start<=end){
swap(nums[start],nums[end]);
start+=1;
end-=1;
}
}
public:
void rotate(vector<int>& nums, int k) {
k%=nums.size(); //注意这个位置,保证移动次数小于数组长度
reverse(nums,0,nums.size()-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.size()-1);
}
};
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。