vlambda博客
学习文章列表

【每日编程-443期】Leetcode.997.有序数组的平方



Leetcode.997.有序数组的平方




给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

样例一:

输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]

样例二:

输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]

1 <= A.length <= 10000

-10000 <= A[i] <= 10000

A 已按非递减顺序排序。


解决方法:

(1)算法的基本思想:

暴力解法:将原来数组的每个数先平方,然后调用sort函数即可。

但是题目给了有序数组,如果将这个条件用上。

按照快排的思想,双向指针的思想解:

定义与A数组等长的空数组B,遍历A数组,因为是非递减数组,left指向前端,right指向尾端,如果left指向的元素的绝对值大于right指向的元素,则将该元素的平方加在B数组的尾部,否则将right指向的元素的平方加在B数组的尾部,直到A遍历结束。

(2)代码实现:

  
    
    
  
//不太厚道的解法
class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        for(int i = 0;i<A.size();i++){
            A[i] = A[i]*A[i];
        }

        sort(A.begin(),A.end());
        return A;
    }
};

//快排_双向指针思想
class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        int left = 0;
        int right = A.size()-1;
        vector<int> B(A.size());
        for(int i = A.size() - 1; i >=0; i--) {
            if(abs(A[left]) > abs(A[right])) {
                B[i] = A[left] * A[left];
                left++;
            } else {
                B[i] = A[right] * A[right];
                right--;
            }
        }
        return B;
    }
};


明日预告:Leetcode.942.增减字符串匹配

给定只含 "I"(增大)或 "D"(减小)的字符串 S ,令 N = S.length。


返回 [0, 1, ..., N] 的任意排列 A 使得对于所有 i = 0, ..., N-1,都有:


  • 如果 S[i] == "I",那么 A[i] < A[i+1]

  • 如果 S[i] == "D",那么 A[i] > A[i+1]


样例一:

输入:"IDID"
输出:[0,4,1,3,2]

样例二:

输入:"III"
输出:[0,1,2,3]

样例三:

输入:"DDI"
输出:[3,2,2,3]
class Solution {
public:
    vector<int> diStringMatch(string S) {

    }
};