算法——有序数组的平方(leetcode977)
有序数组的平方,题目是给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
解这道题一般来说有两种方法一种是暴力解法一种是双指针(时刻要注意以及理解题目的大意方便我们思考解法)
对于暴力解法简单来说逻辑就是将给定数组中的每一个元素平方后覆盖元素得到一个元素平方过后的数组接着进行排序即可(可手写排序算法或者使用java中的排序方法)
对于双指针解法来说由于给定的数组是非递减顺序的整数数组所以我们可以开辟一个新的数组(与给定数组等长)来存储平方后的元素我们给题目给定数组设置两个指针一个指向初始位置一个指向末端位置接着通过比较两个指针元素平方的大小将大的元素的平方放入我们新创建的数组索引末端位置如果相等则随意放入一个元素即可,放入后索引减1重复上述步骤直至原数组的一个指针越过另一个指针或者新数组放满为止输出数组即可
暴力解法与双指针对比来看暴力解法时间复杂度较高可达到O(n^2)而空间复杂度较低可为O(1)
双指针解法来说时间复杂度较低(O(n))但空间复杂度因为创建新数组占用内存空间所以相对较高为O(N)
暴力解法
class Solution {
public int[] sortedSquares(int[] nums) {
//平方数组元素
for(int i=0;i<nums.length;i++){
nums[i]=nums[i]*nums[i];
}
int temp=0;
//冒泡排序
for (int i = 0; i < nums.length-1; i++) {
for(int j=0;j<nums.length-1;j++){
if(nums[j]>nums[j+1]){
temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
return nums;
}
}
双指针解法
class Solution {
public int[] sortedSquares(int[] nums) {
int[] arr=new int[nums.length];
int i=0;
int j=nums.length-1;
int k=arr.length-1;
while(i<=j){
if(nums[i]*nums[i]>nums[j]*nums[j]){
arr[k]=nums[i]*nums[i];
i++;
k--;
}else if(nums[i]*nums[i]<=nums[j]*nums[j]){
arr[k]=nums[j]*nums[j];
j--;
k--;
}
}
return arr;
}
}