LeetCode 977 題:有序數組的平方

LeetCode 977 題:有序數組的平方 (Squares of a Sorted Array)

LeetCode 第977題要求給定一個按非降序排列的整數數組 nums,返回每個數字的平方并按升序排列。


題目描述

給定一個整數數組 nums,它按非降序排列(即 nums[i] <= nums[i+1]),請返回該數組中每個數字的平方并按升序排列。

示例 1

輸入:nums = [-4,-1,0,3,10]
輸出:[0,1,9,16,100]

示例 2

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

解題思路

  1. 雙指針法

    • 因為輸入數組已經按非降序排列,所以數組中的元素的平方值并不會有嚴格的順序。
    • 數組的平方值可能有兩個不同的極端值:
      • 負數的平方會變大,可能會出現在數組的左側。
      • 正數的平方會變小,可能會出現在數組的右側。
  2. 雙指針

    • 我們可以使用兩個指針,一個從數組的左端開始,另一個從右端開始。比較這兩個指針指向的元素的平方值,較大的平方值將放在結果數組的末尾。
    • 將結果數組的指針逐漸向中間靠攏,直到所有的平方值都被放入結果數組。
  3. 復雜度分析

    • 時間復雜度 O ( n ) O(n) O(n),其中 n n n 是數組 nums 的長度。我們只遍歷數組一次。
    • 空間復雜度 O ( n ) O(n) O(n),我們使用額外的數組存儲結果。

C語言代碼實現

以下是使用雙指針法的代碼實現:

#include <stdio.h>
#include <stdlib.h>int* sortedSquares(int* nums, int numsSize, int* returnSize) {int left = 0, right = numsSize - 1;*returnSize = numsSize;int* result = (int*)malloc(sizeof(int) * numsSize);int index = numsSize - 1; // 結果數組的指針從末尾開始while (left <= right) {if (abs(nums[left]) > abs(nums[right])) {result[index--] = nums[left] * nums[left];left++;} else {result[index--] = nums[right] * nums[right];right--;}}return result;
}int main() {int nums[] = {-4, -1, 0, 3, 10};int returnSize;int* result = sortedSquares(nums, 5, &returnSize);printf("Result: ");for (int i = 0; i < returnSize; i++) {printf("%d ", result[i]);}printf("\n");free(result); // 釋放內存return 0;
}

逐行解釋代碼

函數 sortedSquares
int left = 0, right = numsSize - 1;
*returnSize = numsSize;
int* result = (int*)malloc(sizeof(int) * numsSize);
  • 初始化左右指針 leftright,分別指向數組的起始和末尾。
  • returnSize 保存結果數組的大小,即 numsSize
  • 使用 malloc 動態分配內存給結果數組 result,其大小為輸入數組 nums 的長度。

int index = numsSize - 1; // 結果數組的指針從末尾開始
  • index 指針從結果數組的末尾開始,這樣可以確保我們從最大值開始填充數組。

while (left <= right) {if (abs(nums[left]) > abs(nums[right])) {result[index--] = nums[left] * nums[left];left++;} else {result[index--] = nums[right] * nums[right];right--;}
}
  • 使用 while 循環,直到 leftright 指針交匯。
  • 比較 nums[left]nums[right] 的絕對值:
    • 如果 nums[left] 的絕對值大于 nums[right],則將 nums[left] 的平方放入 result 數組的末尾,并將 left 指針向右移動。
    • 否則,將 nums[right] 的平方放入 result 數組的末尾,并將 right 指針向左移動。
  • 每次操作后,index 指針向前移動,以確保將平方值存入正確的位置。

return result;
  • 返回結果數組 result,它包含按升序排列的平方值。

測試代碼 main
int nums[] = {-4, -1, 0, 3, 10};
int returnSize;
int* result = sortedSquares(nums, 5, &returnSize);printf("Result: ");
for (int i = 0; i < returnSize; i++) {printf("%d ", result[i]);
}
printf("\n");free(result); // 釋放內存
  • 定義一個測試用例 nums = {-4, -1, 0, 3, 10}
  • 調用 sortedSquares 函數獲取結果。
  • 打印輸出結果數組。
  • 使用 free 釋放 malloc 動態分配的內存。

測試結果

運行代碼后輸出:

Result: 0 1 9 16 100

復雜度分析

  1. 時間復雜度 O ( n ) O(n) O(n)

    • 我們只遍歷一次數組,leftright 每次向內移動一次,最終會遍歷整個數組。
  2. 空間復雜度 O ( n ) O(n) O(n)

    • 我們使用了一個額外的數組 result 來存儲平方后的結果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65924.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65924.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65924.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

excel僅復制可見單元格,僅復制篩選后內容

背景 我們經常需要將內容分給不同的人&#xff0c;做完后需要合并 遇到情況如下 那是因為直接選擇了整列&#xff0c;當然不可以了。 下面提供幾種方法&#xff0c;應該都可以 直接選中要復制區域然后復制&#xff0c;不要選中最上面的列alt;選中可見單元格正常復制&#xff…

微信小程序實現拖拽盒子效果

要實現一個當前盒子高度由里面的盒子進行支配高度拖拽的效果 // wxml<view class"exmation-item" wx:elif"{{type4}}"> <view class"exmation-item-drag-box" id"drag-box"> <!-- 內容 --><view class"exm…

支持向量回歸(SVR:Support Vector Regression)用于A股數據分析、預測

簡單說明 支持向量回歸是一種用來做預測的數學方法,屬于「機器學習」的一種。 它的目標是找到一條「最合適的線」,能夠大致描述數據點的趨勢,并允許數據點離這條線有一定的誤差(不要求所有點都完全落在這條線上)。 可以把它想象成:找到一條「寬帶」或「隧道」,大部分…

透明部署、旁路邏輯串聯的區別

背景 需討論防火墻到底是串聯&#xff0c;還是旁掛。 通常串聯指的就是“透明部署”&#xff0c;旁掛指的就是“邏輯串聯”。 透明部署&#xff08;串聯&#xff09; 也稱為透明模式或橋接模式&#xff0c;是一種安全設備的部署方式。在這種模式下&#xff0c;安全設備被串聯…

LabVIEW水位監控系統

LabVIEW開發智能水位監控系統通過集成先進的傳感技術與控制算法&#xff0c;為工業液體存儲提供精確的水位調控&#xff0c;保證了生產過程的連續性與安全性。 項目背景 在化工和飲料生產等行業中&#xff0c;水位控制的準確性對保證生產安全和提高產品質量至關重要。傳統的水…

深入淺出 Android AES 加密解密:從理論到實戰

深入淺出 Android AES 加密解密&#xff1a;從理論到實戰 在現代移動應用中&#xff0c;數據安全是不可忽視的一環。無論是用戶隱私保護&#xff0c;還是敏感信息的存儲與傳輸&#xff0c;加密技術都扮演著重要角色。本文將以 AES&#xff08;Advanced Encryption Standard&am…

hadoop-yarn常用命令

一、YARN命令介紹 1. YARN命令簡介 YARN提供了一組命令行工具&#xff0c;用于管理和監控YARN應用程序和集群。 2. yarn application命令 (1) yarn application命令的基本語法 yarn application命令的基本語法如下&#xff1a; yarn application [genericOptions] [comma…

R語言的語法糖

R語言的語法糖 引言 在編程語言中&#xff0c;所謂的“語法糖”是指那些使得程序員能夠以更簡潔、直觀的方式書寫代碼的語法形式。R語言作為一種用于統計分析和數據可視化的編程語言&#xff0c;具有豐富的功能和靈活的語法。本文將深入探討R語言中的語法糖&#xff0c;幫助讀…

React Fiber框架中的Render渲染階段——workLoop(performUnitOfWork【beginWork與completeWork】)

觸發渲染過程——renderRoot renderRoot 是一個函數&#xff0c;用于觸發渲染工作。它通常會調用并遞歸地執行一系列的渲染任務&#xff0c;直到完成整個更新過程。這個過程包括執行 Fiber 樹中的 beginWork 和 completeWork&#xff0c;以及渲染新狀態或 DOM。 function ren…

【優先算法】思還故里閭,欲歸道無因 - 前綴和

本篇博客給大家帶來的是前綴和算法的知識點, 也是一樣通過OJ題理解,掌握,應用該算法. &#x1f40e;文章專欄: 算法 &#x1f680;若有問題 評論區見 ? 歡迎大家點贊 評論 收藏 分享 如果你不知道分享給誰,那就分享給薯條. 你們的支持是我不斷創作的動力 . 王子,公主請閱&…

億道三防丨三防筆記本是什么意思?和普通筆記本的優勢在哪里?

三防筆記本是什么意思&#xff1f;和普通筆記本的優勢在哪里&#xff1f; 在現代社會中&#xff0c;筆記本電腦已經成為人們工作和生活中不可或缺的一部分。然而&#xff0c;在一些特殊行業或環境中&#xff0c;普通筆記本電腦由于其脆弱性和對環境條件的敏感性&#xff0c;往…

SOME/IP 協議詳解——服務發現

文章目錄 1. Introduction &#xff08;引言&#xff09;2. SOME/IP Service Discovery (SOME/IP-SD)2.1 General&#xff08;概述)2.2 SOME/IP-SD Message Format2.2.1 通用要求2.2.2 SOME/IP-SD Header2.2.3 Entry Format2.2.4 Options Format2.2.4.1 配置選項&#xff08;Co…

MATLAB語言的函數實現

MATLAB語言中的函數實現詳解 引言 MATLAB&#xff08;矩陣實驗室&#xff09;是一種高級語言和互動環境&#xff0c;廣泛應用于數值計算、數據分析、可視化以及工程與科學計算等多個領域。MATLAB的強大之處在于其豐富的函數庫以及用戶自定義函數的能力。本文將深入探討MATLAB…

Go語言之路————go環境的初始化

Go語言之路————go環境的初始化 前言一、Go的安裝二、環境配置三、初始化一個新項目四、常用的一些指令 前言 我是一名多年Java開發人員&#xff0c;因為工作需要現在要學習go語言&#xff0c;Go語言之路是一個系列&#xff0c;記錄著我從0開始接觸Go&#xff0c;到后面能正…

鼠標過濾驅動

文章目錄 概述代碼參考資料 概述 其編寫過程大體與鍵盤過濾驅動相似&#xff0c;只需要切換一下附加的目標設備以及創建的設備類型等。但在該操作后依然無法捕獲到Vmware創建的win7操作系統的鼠標irp信息&#xff0c;于是通過在獲取鼠標驅動&#xff0c;遍歷其所有的設備進而附…

鴻蒙UI開發——基于onTouch事件實現表情選擇膠囊

1、背 景 有朋友留言說&#xff0c;抖音APP中&#xff0c;長按評論按鈕觸發的快捷表情選擇膠囊動畫比較好&#xff08;效果如下圖&#xff09;&#xff0c;希望使用鴻蒙ArkTs也實現一個類似的。 本文在鴻蒙ArkTs下也實現一個類似的效果&#xff0c;如下&#xff1a; 首先&…

Node.js——http 模塊(二)

個人簡介 &#x1f440;個人主頁&#xff1a; 前端雜貨鋪 &#x1f64b;?♂?學習方向&#xff1a; 主攻前端方向&#xff0c;正逐漸往全干發展 &#x1f4c3;個人狀態&#xff1a; 研發工程師&#xff0c;現效力于中國工業軟件事業 &#x1f680;人生格言&#xff1a; 積跬步…

研華 PCI-1751 驅動更新導LabVIEW致程序異常

問題描述&#xff1a; 某 LabVIEW 程序長期運行正常&#xff0c;但在使用研華 PCI-1751 數據采集卡運行一段時間后&#xff0c;程序開始出現不正常的行為。具體過程如下&#xff1a; 初始問題&#xff1a; 更換新的 PCI-1751 板卡后&#xff0c;驅動程序被更新&#xff0c;但程…

接上篇基于Alertmanager 配置釘釘告警

Alertmanager 是一個用于處理和管理 Prometheus 警報的開源工具。它負責接收來自 Prometheus 服務器的警報&#xff0c;進行去重、分組、靜默、抑制等操作&#xff0c;并通過電子郵件、PagerDuty、Slack 等多種渠道發送通知。 主要功能 去重&#xff1a;合并相同或相似的警報&…

網絡原理(三)—— 傳輸層 之 UDP 和 TCP協議

傳輸層 在傳輸層兩大關鍵的協議就是UDP和TCP協議了&#xff0c;除此之外&#xff0c;還有別的傳輸層協議&#xff0c;本文章將介紹UDP和TCP協議&#xff0c;重點介紹TCP協議。 首先回顧TCP和UDP 的特點&#xff1a; UDP&#xff1a;不可靠傳輸&#xff0c;面向數據包&#xf…