溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java怎么實(shí)現(xiàn)非下降數(shù)組

發(fā)布時(shí)間:2022-03-22 15:32:30 來源:億速云 閱讀:188 作者:iii 欄目:云計(jì)算

今天小編給大家分享一下java怎么實(shí)現(xiàn)非下降數(shù)組的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

題目描述

給出包含n個(gè)整數(shù)的數(shù)組,你的任務(wù)是檢查它是否可以通過修改至多一個(gè)元素變成非下降的。一個(gè)非下降的數(shù)組array對(duì)于所有的i(1<=i<n)滿足array[i-1]<=array[i]。n屬于區(qū)間[1,10000]。

樣例1:

ⅰ 輸入: [4,2,3]

ⅱ 輸出: True

ⅲ 說明: 可以把第一個(gè)數(shù)4修改為1,得到[1,2,3]為非下降的數(shù)組

樣例2:

ⅰ 輸入: [4,2,1]

ⅱ 輸出: False

ⅲ 說明: 無法通過修改至多一個(gè)元素使數(shù)組變?yōu)榉窍陆档摹?/p>

解題思路分析

a. 簡單的思考可以得到,情況無非為三種:不需要修改就滿足條件的、修改一個(gè)元素可滿足條件的和修改一個(gè)元素也無法滿足條件的。對(duì)于第一種情況,只需遍歷數(shù)組看是否滿足數(shù)組的每一項(xiàng)都大于等于前一項(xiàng),滿足則返回true。對(duì)于第二種情況,可以枚舉要修改的那個(gè)數(shù)array[i],再去檢查array[i]之前的數(shù)是否是非下降的,array[i]之后的數(shù)是否是非下降的,最后還應(yīng)該檢查array[i-1]<=array[i+1]是否成立(如果array[i]位于邊界則無需檢查),如果成立則可以將array[i]改為array[i-1]和array[i+1]之間的任何數(shù)使數(shù)組變?yōu)榉窍陆禂?shù)組,這是情況二,返回true,如果對(duì)于所有的i都不成立,則為情況三,返回false。這樣做的時(shí)間復(fù)雜度為O(n^2),額外空間復(fù)雜度為O(1)。

b. 修改一個(gè)數(shù)以后可以變成非下降的數(shù)組滿足什么條件呢?顯然,這樣的數(shù)組應(yīng)當(dāng)滿足只存在一對(duì)相鄰的數(shù)不滿足非下降的條件,即只存在唯一的i(1<=i<n)滿足array[i-1]>array[i],可以斷言,如果這樣的i存在多個(gè),則原數(shù)組無法通過修改至多一個(gè)數(shù)變?yōu)榉窍陆禂?shù)組。那么是否滿足這個(gè)條件的數(shù)組都可以通過修改一個(gè)數(shù)而滿足非下降呢?不是的,比如[2,4,1,3],只有相鄰的4,1不滿足非下降,但它不能通過只改變一個(gè)數(shù)變?yōu)榉窍陆怠F鋵?shí),如果只存在一個(gè)i滿足array[i-1]>array[i],那么要修改的那個(gè)數(shù)一定在array[i-1]和array[i]這兩個(gè)數(shù)之中,那么就可以套用上一種做法,對(duì)于兩種情況分別進(jìn)行判斷即可。更進(jìn)一步地來說,由于只有對(duì)于i才有array[i-1]>array[i]成立,所以別的所有相鄰的數(shù)均滿足非下降的條件,因此對(duì)于array[i-1]來說,它之前和它之后的數(shù)組均分別滿足非下降的條件,對(duì)于array[i]亦是如此,所以,只需判斷前后兩段數(shù)組能否可以接成非下降的數(shù)組即可。具體來說,如果要修改的數(shù)是array[i-1],那么只需判斷array[i-2]<=array[i]是否成立,同樣的如果要修改array[i],那么應(yīng)判斷array[i-1]<=array[i+1]是否成立,當(dāng)然如果array[i-1]或array[i]位于邊界則直接成立??偨Y(jié)該算法:統(tǒng)計(jì)所有不滿足非下降的相鄰位置的個(gè)數(shù)count,如果count為0,則返回true(不用修改),若count大于1,則返回false,否則應(yīng)進(jìn)行進(jìn)一步的判斷:設(shè)不滿足非下降的位置為i,array[i-1]>array[i],則最終返回true的條件為array[i-1]、array[i]為邊界或者array[i-2]<=array[i]或者array[i-1]<=array[i+1]。時(shí)間復(fù)雜度為O(n),額外空間復(fù)雜度為O(1)。

參考程序

Java版本:

java怎么實(shí)現(xiàn)非下降數(shù)組

以上就是“java怎么實(shí)現(xiàn)非下降數(shù)組”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI