LeetCode進階977-雙指針

概要

雙指針是一種比較常見的算法思想,在循環遍歷數組時常常會用到。雙指針主要有兩種算法技巧:一、快慢指針(例如已發推文中的LeetCode進階-實戰之快慢指針(阿里面試題)),利用指針肯定的相對位置關係,快指針先到達邊界的特色進行搜索;二、雙向指針,雙向指針的特色兩指針分別從前日後和從後往前遍歷,本文介紹的正是這種用法。面試

原題

977. Squares of a Sorted Array (Easy)

Given an array of integers A sorted in non-decreasing order, return an array of the squares of each number, also in sorted non-decreasing order.算法

Example 1:數組

Input: [-4,-1,0,3,10] Output: [0,1,9,16,100] Example 2:bash

Input: [-7,-3,2,3,11] Output: [4,9,9,49,121]ui

Note:編碼

1 <= A.length <= 10000 -10000 <= A[i] <= 10000 A is sorted in non-decreasing order.spa

977.有序數組的平方

給定一個按非遞減順序排序的整數數組 A,返回每一個數字的平方組成的新數組,要求也按非遞減順序排序。指針

示例 1:code

輸入:[-4,-1,0,3,10] 輸出:[0,1,9,16,100] 示例 2:cdn

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

提示:

1 <= A.length <= 10000 -10000 <= A[i] <= 10000 A 已按非遞減順序排序。

  • 分類:雙指針

分析&&思路

根據題意,數組爲非遞減順序,數組中可能存在負數和非負數。負數在數組中從左到右平方(絕對值)依次變小,正數從右到左平方(絕對值)依次變小。所以採用雙指針分別從左往右、從右往左對比交換。

僞代碼

一、new一個大小與入參大小一致的int數組;
二、聲明兩個指針下標,從左往右的指針和從右往左的指針;
三、for循環,從數組尾下標到起始下標0
  i.若從右往左正數絕對值較大則將較大絕對值的數平方放入數組末位,同時從右到左指針左移一位;
  ii.若從左往右非正數絕對值較大則將較大絕對值的數放入數組末位,同時從左到右指針右移一位;
四、循環結束,返回新數組的平方數的有序數組;
複製代碼

編碼實踐

public int[] sortedSquares(int[] A) {
        int n = A.length;
        int[] result = new int[n];
        int i = 0, j = n - 1;
        for (int p = n - 1; p >= 0; p--) {
            if (Math.abs(A[i]) > Math.abs(A[j])) {
                result[p] = A[i] * A[i++];
            } else {
                result[p] = A[j] * A[j--];
            }
        }
        return result;
    }
複製代碼

結語

本篇介紹了雙指針中比較經典的雙向指針的用法,相對簡單可是比較有表明性適合算法基礎入門。事實上雙向指針在不少經典的算法思想中都有出現,典型的好比快速排序就有用到。最後,若是以爲本篇對你有所幫助,不妨關注走一波~

關注訂閱號 獲取更多幹貨~
相關文章
相關標籤/搜索