LeetCode997
双指针! - 找到0的左右,分别从左右插入到新数组中 - 从左到右比较最大的数,从大到小插入新的数组中
This commit is contained in:
parent
529a6193d9
commit
961aa4cea9
152
src/main/java/cn/whaifree/leetCode/easy/LeetCode977.java
Normal file
152
src/main/java/cn/whaifree/leetCode/easy/LeetCode977.java
Normal file
@ -0,0 +1,152 @@
|
||||
package cn.whaifree.leetCode.easy;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* 977. 有序数组的平方
|
||||
*
|
||||
* 给你一个按 非递减顺序 排序的整数数组 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]
|
||||
*
|
||||
* 提示:
|
||||
*
|
||||
* 1 <= nums.length <= 104
|
||||
* -104 <= nums[i] <= 104
|
||||
* nums 已按 非递减顺序 排序
|
||||
*
|
||||
*
|
||||
* 进阶:
|
||||
*
|
||||
* 请你设计时间复杂度为 O(n) 的算法解决本问题
|
||||
*
|
||||
* 更多挑战
|
||||
* 88. 合并两个有序数组
|
||||
* 360. 有序转化数组
|
||||
*/
|
||||
public class LeetCode977 {
|
||||
|
||||
/**
|
||||
* 找到第一个左边小于0,右边大于等于0的点
|
||||
* 左右两个指针
|
||||
* 平方后必然是,【递减 0 递增】
|
||||
* [-3,-1,0,2,5]
|
||||
* [9,1,0,4,25]
|
||||
*
|
||||
* 让左边的循环插入到右边合适的位置
|
||||
* @param nums
|
||||
* @return
|
||||
*/
|
||||
public int[] sortedSquares(int[] nums) {
|
||||
|
||||
int middle = nums.length;
|
||||
for (int i = 0; i < nums.length; i++) {
|
||||
if (nums[i] >= 0) {
|
||||
middle = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 此时就有两个数组了
|
||||
// [0,middle-1] 为递减的
|
||||
// [middle, length-1] 为递增的
|
||||
int[] ints = new int[nums.length];
|
||||
int leftIndex = middle -1;
|
||||
int rightIndex = middle;
|
||||
int intIndex = 0;
|
||||
while (leftIndex >= 0 && rightIndex < nums.length) {
|
||||
if (nums[leftIndex] * nums[leftIndex] < nums[rightIndex] * nums[rightIndex]) {
|
||||
ints[intIndex++] = nums[leftIndex] * nums[leftIndex];
|
||||
leftIndex--;
|
||||
} else {
|
||||
ints[intIndex++] = nums[rightIndex] * nums[rightIndex];
|
||||
rightIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
while (leftIndex >= 0) {
|
||||
ints[intIndex++] = nums[leftIndex] * nums[leftIndex];
|
||||
leftIndex--;
|
||||
}
|
||||
while (rightIndex <= nums.length-1) {
|
||||
ints[intIndex++] = nums[rightIndex] * nums[rightIndex];
|
||||
rightIndex++;
|
||||
}
|
||||
|
||||
return ints;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 不考虑0的双指针
|
||||
* @param nums
|
||||
* @return
|
||||
*/
|
||||
public int[] sortedSquares1(int[] nums) {
|
||||
int[] ints = new int[nums.length];
|
||||
|
||||
int left = 0;
|
||||
int right = nums.length - 1;
|
||||
int index = 0;
|
||||
while (left <= right) {
|
||||
if (nums[left] * nums[left] < nums[right] * nums[right]) {
|
||||
ints[index++] = nums[right] * nums[right];
|
||||
right--;
|
||||
} else {
|
||||
ints[index++] = nums[left] * nums[left];
|
||||
left++;
|
||||
}
|
||||
}
|
||||
|
||||
// 逆序
|
||||
int value = 0;
|
||||
for (int i = 0; i < ints.length / 2; i++) {
|
||||
value = ints[i];
|
||||
ints[i] = ints[ints.length - i - 1];
|
||||
ints[ints.length - 1 - i] = value;
|
||||
}
|
||||
|
||||
return ints;
|
||||
}
|
||||
|
||||
public int[] sortedSquares2(int[] nums) {
|
||||
int[] ints = new int[nums.length];
|
||||
|
||||
int left = 0;
|
||||
int right = nums.length - 1;
|
||||
// 存入新数组的索引,从大往小存
|
||||
int index = nums.length - 1;
|
||||
while (left <= right) {
|
||||
// 负数 + 正数 > 0 则 |负数| < |正数|
|
||||
if (nums[left] + nums[right] > 0) {
|
||||
ints[index--] = nums[right] * nums[right];
|
||||
right--;
|
||||
} else {
|
||||
ints[index--] = nums[left] * nums[left];
|
||||
left++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return ints;
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
int[] ints = sortedSquares2(new int[]{-3,-1,4,10});
|
||||
for (int i = 0; i < ints.length; i++) {
|
||||
System.out.println(ints[i]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user