双指针
题目一
- 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
解题思路
注意题目先给的nums,是非递减排序,也就是递增排序。我们只需要去初始化一个新数组去存nums的平方,然后对nums[ ]的值进行大小判断,然后再赋值给新数组即可。因为是用JAVA去解决问题,我们没办法去创建指针,我们可以通过对下标控制来完成类似指针的功能。
class Solution {
public int[] sortedSquares(int[] nums) {
int result[] =new int [nums.length];
int i=0,j=nums.length-1;
for(i=0;i<nums.length;i++)
{
nums[i]=nums[i]*nums[i];
}//这个时候我们已经将平方算出来,要始终注意初始数组是递增的
i=0;
while(i<=j)
{
if(nums[i]>nums[j])//我们去进行判断,第一个与最后一个比较,因为比最后一个大的只有可能一开始为负数,然后平方后比他大的
{
result[j-i]=nums[i];
i++;
}
else
{
result[j-i]=nums[j];
j--;
}
}
return result;
}
}
题目二
- 旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
解题思路
同样也可以将同一个数组分解为两个数组,一个是要旋转的部分数组,另一部分是不旋转的,然后最后两者拼接皆可,不过这样的空间复杂度和时间复杂度都为O(n)。
class Solution {
public void rotate(int[] nums, int k) {
int subnums[]=new int [k];
int result[]=new int [nums.length];
if(k>nums.length)
{
while(k>nums.length)
{
k=k-nums.length;
}
}
for(int i=0;i<k;i++)
{
subnums[k-1-i]=nums[nums.length-1-i];
}
for(int i=0;i<nums.length;i++)
{
if(i<k)
{
result[i]=subnums[i];
}
else
{
result[i]=nums[i-k];
}
}
for(int i=0;i<nums.length;i++)
{
nums[i]=result[i];
}
}
}
进阶解法
我们使用字符串翻转方法,可以将空间复杂度降为O(1)
public void rotate_2(int[] nums, int k) {
int n = nums.length;
k %= n;
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
}
private void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start++] = nums[end];
nums[end--] = temp;
}
}