java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846
1. 时间复杂度 = 空间复杂度 = O(n * l o g 2 n log_2{n} l o g 2 n )
最直接的想法就是先算出每个元素的平方和,然后排序,所以排序的效率就是这个算法的效率。那么目前综合性能比最好,实现也简单的就是快速排序算法,它的时间和空间复杂度为O(n * l o g 2 n log_2{n} l o g 2 n )
快速排序https://blog.csdn.net/grd_java/article/details/135671368
代码:时间复杂度O(n * l o g 2 n log_2{n} l o g 2 n ).空间复杂度O(n * l o g 2 n log_2{n} l o g 2 n )
class Solution { public int [ ] sortedSquares ( int [ ] nums) { for ( int i = 0 ; i < nums. length; i++ ) { nums[ i] = ( int ) Math . pow ( nums[ i] , 2.0 ) ; }
Arrays . sort ( nums) ; return nums; } public void quickSort ( int arr[ ] ) { quickSort ( arr, 0 , arr. length- 1 ) ; } public void quickSort ( int arr[ ] , int low, int high) { if ( low< high) { int pivotPosition = quickSortPartition ( arr, low, high) ; quickSort ( arr, low, pivotPosition- 1 ) ; quickSort ( arr, pivotPosition+ 1 , high) ; } } public int quickSortPartition ( int arr[ ] , int low, int high) { int pivot = arr[ low] ; while ( low< high) { while ( low< high && arr[ high] >= pivot) -- high; arr[ low] = arr[ high] ; while ( low< high && arr[ low] <= pivot) ++ low; arr[ high] = arr[ low] ; } arr[ low] = pivot; return low; }
}
2. 时间复杂度O(n),空间复杂度O(1)
其实直接用排序算法,有些太奢侈了,而上面快速排序主要用双指针的思想。那么我们直接用双指针做这道题,是不是更好呢?
class Solution { public int [ ] sortedSquares ( int [ ] nums) { int n = nums. length; int low = 0 , high = n - 1 ; int position = n- 1 ; int [ ] answer = new int [ n] ; while ( high >= low) { int leftPow = nums[ low] * nums[ low] ; int rightPow = nums[ high] * nums[ high] ; if ( leftPow > rightPow) { answer[ position] = leftPow; low++ ; } else { answer[ position] = rightPow; high-- ; } position -- ; } return answer; }
}