1、977.有序数组的平方
package DAY1_DAY2_array;
/**
* 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
* 示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
* 示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
*/
/**
* 977.有序数组的平方
* 总体思路 数组还是有序数组,按照升序排列,按照暴力算法就是求平方然后再排序
* 但是这种数组有规律可循
* 由于是平方,负数平方后有可能比正数大(如果所有数是正数那这题就没有意义了)
* 所以平方后的数组最大值只会出现在两端
* 从两端遍历数组,考虑使用双指针
*/
public class DAY2_977 {
public static void main(String[] args) {
int[] nums = {-4,-1,0,3,10};
int[] ints = sortedSquares(nums);
for (int anInt : ints) {
System.out.println(anInt);
}
}
/**
*碰到相等的情况,完全可以放左边的或者右边的,剩余一方再放回去比较即可
*/
public static int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int i = nums.length - 1;
int[] temp = new int[nums.length];
while (left <= right){
if(Math.pow(nums[left],2) > Math.pow(nums[right],2)){
temp[i--] = (int)Math.pow(nums[left],2);
left++;
}else{
temp[i--] = (int)Math.pow(nums[right],2);
right--;
}
}
return temp;
}
/**
* 关于自增自减
* int i = 1;
* i = i++;
* System.out.println(i); //1
*
* * 1)我们先把后面的i(i++中的i)装进空间: temp = i;
* * 2)在单独对后面的i进行++操作: i = i + 1;
* * 3)我们在把空间中的值给前面的i: i = temp;
* * 操作完后i的值为1,不是2
*
* 前++
* int j=1;
* j = ++j;
* System.out.println(j); //2
* * 1)我们单独先对后面的j进行++操作: j = j + 1;
* * 2)在把后面的j装进空间内: temp = j;
* * 3)在把空间中的值给前面的j: j = temp;
* * 操作完后j的值为2,而不是1.
*/
/**
*自己写的 分了 < > + 三种情况去写 其实完全可以只分两种 代码会更简洁
*另外 temp数组按照题意应该是升序而不是降序 这就要注意存放数据到temp的时候要反过来放
*/
/*public static int[] sortedSquares(int[] nums) {
int[] temp = new int[nums.length]; //先创建和nums长度相等的数组空间
int left = 0;
int right = nums.length - 1;
int i = 0;
while (left<=right){
if(Math.pow(nums[left],2) > Math.pow(nums[right],2)){
temp[i] = (int)Math.pow(nums[left],2);
left ++;
}else if(Math.pow(nums[left],2) < Math.pow(nums[right],2)){
temp[i] = (int)Math.pow(nums[right],2);
right --;
}else if(Math.pow(nums[left],2) == Math.pow(nums[right],2)){
temp[i] = (int)Math.pow(nums[right],2);
if(i<temp.length-1)i++;//这一步会添加两次 但不排除左右其实指的是最后一个同一个数 注意数组溢出问题!
temp[i] = (int)Math.pow(nums[left],2);
left ++;right --;
}
i++;
}
return temp;
}*/
}