给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
方法一:使用最简单的 for 循环
class Solution {
public int[] sortedSquares(int[] nums) {
int[] a=new int[nums.length];
for(int i=0;i<=nums.length-1;++i){
a[i] = nums[i] * nums[i];
}
Arrays.sort(a);
return a;
}
}
方法二:运用双指针
class Solution {
public int[] sortedSquares(int[] nums) {
int n=nums.length;
int[] a= new int[n];
for(int i=0 , j=n-1 , pos=n-1;i<=j;){
if(nums[i]*nums[i]>nums[j]*nums[j]){
a[pos]=nums[i]*nums[i];
++i;
}else{
a[pos]=nums[j]*nums[j];
--j;
}
--pos;
}
return a;
}
}
难度中等1523
给你一个数组,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
方法一:使用额外数组
我们可以使用额外的数组来将每个元素放至正确的位置。用 nn 表示数组的长度,我们遍历原数组,将原数组下标为 ii 的元素放至新数组下标为 (i+k)\bmod n(i+k)modn 的位置,最后将新数组拷贝至原数组即可。
class Solution {
public void rotate(int[] nums, int k) {
int n=nums.length;
int[] a=new int[n];
for(int i=0;i<n;++i){
a[(i+k)%n]=nums[i];
}
System.arraycopy(a, 0, nums, 0, n);
}
}
方法二:比较难以想到 数组的翻转
class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;//降低K的值
reverse(nums, 0, nums.length - 1);//全部翻转
reverse(nums, 0, k - 1);//翻转前K个
reverse(nums, k, nums.length - 1);//翻转剩下的
}
public void reverse(int[] nums, int start, int end) {
while(start<end){
int temp=nums[start];
nums[start]=nums[end];
nums[end]=temp;
start+=1;
end-=1;
}
}
}