🌻算法,不如说它是一种思考方式🍀
算法专栏: 👉🏻123
- 示例 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]
*进阶:
请你设计时间复杂度为 O(n) 的算法解决本问题
最简单的想法:直接对数组平方后排序,而排序算法中的快速排序时间复杂度达到O(nlogn)。
这个问题只是由于前面部分的负数影响我们的结果,在负数那一块在前面的更大,所以可以在前后双指针往中间遍历,(先找大的)对比平方值从后往前存入结果中,就可以完成。
code:
class Solution {public int[] sortedSquares(int[] nums) {int i=0;int end =nums.length;int[] ans=new int[end];end--;int k=end;while(i <= end) {if(nums[i]*nums[i]ans[k]=nums[end]*nums[end];end--;k--;}else{ans[k]=nums[i]*nums[i];i++;k--;}}return ans;}
}
那么我们也可以从中间开始,先找到最小的:
code:
class Solution {
public int[] sortedSquares(int[] nums) {int n=nums.length;int[] ans=new int[n];if(nums[0]>=0){insert(nums,ans,0);}else{for (int i = 0; i < n; i++) {//找到第一个非负数if(nums[i]>=0){insert(nums,ans,i);break;}else if(i==n-1){//都是负数insert(nums,ans,i+1);break;}}}return ans;}private static void insert(int[] nums, int[] ans, int i) {int j=i-1;int k=0;while (j >=0&&iif(j<0)break;//前面的小if(-nums[j]ans[k]=nums[j]*nums[j];j--;k++;}else{ans[k]=nums[i]*nums[i];i++;k++;}}while(j>=0) {ans[k]=nums[j]*nums[j];j--;k++;}while(ians[k]=nums[i]*nums[i];i++;k++;}}
}
☕物有本末,事有终始,知所先后。🍭
🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓
上一篇:【Unity入门】3D物体
下一篇:网络同步——帧同步和状态同步解析