zoukankan      html  css  js  c++  java
  • LeetCode 977. 有序数组的平方 双指针 二分

    地址 https://leetcode-cn.com/problems/squares-of-a-sorted-array/

    给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
    
     
    
    示例 1:
    
    输入:[-4,-1,0,3,10]
    输出:[0,1,9,16,100]
    示例 2:
    
    输入:[-7,-3,2,3,11]
    输出:[4,9,9,49,121]
     
    
    提示:
    
    1 <= A.length <= 10000
    -10000 <= A[i] <= 10000
    A 已按非递减顺序排序。

    三种方法都是利用了数组有序和考虑到了 正负数的平方都未正,所以实际大小应该以绝对值比较。
    但是在0之前后0之后的数组是已经有序了

    算法1
    (暴力枚举) 遍历后 答案数组再排序
    C++ 代码

    class Solution {
    public:
        vector<int> sortedSquares(vector<int>& A) {
            vector<int> ret;
            for(auto& e:A){
                ret.push_back(e*e);
            }
    
            sort(ret.begin(),ret.end());
    
            return ret;
        }
    };

    算法2
    双指针
    l作为起点(可能是负数) r作为另一端的起点(整数)
    每次取LR中绝对值较大的数字放入答案并且移动(l/r)
    最后逆转答案就是从小到大

    C++ 代码

    class Solution {
    public:
        vector<int> ans;
        vector<int> sortedSquares(vector<int>& A) {
            int l = 0; int r = A.size()-1;
            while (l <= r) {
                if (abs(A[l]) > abs(A[r])) {
                    ans.push_back(A[l]*A[l]);
                    l++;
                }
                else {
                    ans.push_back(A[r] * A[r]);
                    r--;
                }
            }
            reverse(ans.begin(), ans.end());
            return ans;
        }
    };

    算法3
    算法2的加强版。 算法2如果指针l是负数 那么找到r的位置是进行遍历的
    在数组负数较多的情况下 比较慢,使用二分可以再次提速
    二分找到 0点之后后再使用双指针
    每次取LR中绝对值较大的数字放入答案并且移动(l/r)

    class Solution {
    public:
        vector<int> ans;
    
        bool Check(const vector<int>& A, int n,int idx)
        {
            return A[idx] >= n;
        }
    
        int bsearch(const vector<int>& A, int n)
        {
            int l = 0; int r = A.size()-1;
    
            while (l < r) {
                int mid = l + r >> 1;
                if (Check(A, n, mid)) r = mid;
                else l = mid +1;
            }
            return l;
        }
    
        vector<int> sortedSquares(vector<int>& A) {
            int zeroIdx = bsearch(A, 0);
            int l = zeroIdx - 1; int r = zeroIdx;
            while (l >= 0 && l < A.size() && r>=0 && r < A.size()) {
                if (abs(A[l]) >= (A[r])) {
                    ans.push_back(A[r] * A[r]);
                    r++;
                }
                else {
                    ans.push_back(A[l] * A[l]);
                    l--;
                }
            }
    
            while (l >= 0) {
                ans.push_back(A[l] * A[l]);
                l--;
            }
    
            while (r < A.size()) {
                ans.push_back(A[r] * A[r]);
                r++;
            }
    
            return ans;
        }
    };

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    BZOJ 4025: 二分图
    20180803 题解 Winniechen's Tesst
    前尘浮华一场梦 NOI2018 游记
    UOJ#311. 【UNR #2】积劳成疾
    欢迎到我的新Blog!
    弹飞大爷 BZOJ4764 LCT维护内向基环树森林
    [SCOI2007]修车 BZOJ1070
    KD-Tree
    CDQ分治
    深入解析DC/OS 1.8 – 高可靠的微服务及大数据管理平台
  • 原文地址:https://www.cnblogs.com/itdef/p/13830835.html
Copyright © 2011-2022 走看看