演算法 秒殺陣列元素位置調整類問題

2021-10-04 17:21:06 字數 1536 閱讀 7204

這類題目有點特別,不要求我們對陣列元素進行像正常排序那樣從大到小或者從小到大,而是要求我們使用o(n)的方法將符合條件的元素排在前面或者後面。其實這是排序的一種變形,不需要我們消滅逆序數。

解決思路有兩類:

1、利用快排思想,將符合條件資料放在前面或後面,一遍遍歷即可完成

2、指標的思想

2、利用氣泡排序思想,我們將符合條件的資料冒在前面,而且我們不需要消滅逆序數,因此每個元素訪問2次,所以時間複雜度仍然是o(n)

以奇數為例,使用快排思想,快排中我們選擇的樞紐元其實是作為乙個條件出現的,而在這裡,只不過這個「樞紐元」換成了奇數偶數而已。

/**

* 利用快排思想,複雜度o(n)

* @param nums

*/public

static

void

reorder

(int

nums)

//找到第乙個偶數

while

(left(nums[right]&1

)==0)

//找到第乙個奇數

if(left}}

我們還可以有另一種操作: 指標法

使用乙個指標指向當前第乙個不符合條件的位置,然後遍歷陣列,每次遇到符合條件的,我們就可以將其交換,這樣就可以實現題目要求。而且這個方法寫起來非常簡潔

public

static

void

reorder

(int

nums)

}}

這類題目和上面相比,稍微複雜了點,這裡要求我們維持相對順序不變。冒泡法給我們帶來了希望。已經冒過的位置不在冒泡,說明每個元素被訪問了兩次,所以時間複雜度為o(n)

我們也用乙個指標指向第乙個不符合條件的位置,然後遍歷陣列,冒泡冒到那個位置

public

static

void

reorder

(int

nums)

ptr++;}

}}

2中的**可以直接放在1中使用

//交換元素

public

static

void

swap

(int

nums,

int i,

int j)

題目很簡單,直接套殼就好了。。。

public

void

movezeroes

(int

nums)

ptr--;}

}}

不過,我們其實可以針對本題進行優化。因為我們知道特定的資料為0,那麼我們就可以統計非零個數,然後將後面置零。

public

void

movezeroes

(int

nums)

}for

(int i=nozeroindex;i)}

LeetCode 陣列類演算法 移除元素

給定乙個陣列 nums 和乙個值 val,你需要原地移除所有數值等於 val 的元素,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。示例 1 給定 nums 3,2,2,3 ...

搞定演算法 陣列的奇偶位置問題

一起交流秋招面試經驗,可獲得博主的秋招簡歷和複習筆記。題目 給定乙個整型陣列,請在原地調整這個陣列,保證要麼偶數字置上都是偶數,或者奇數字置上都是奇數。要求 時間複雜度 o n 額外空間複雜度 o 1 下面的 中,將最後乙個元素作為發貨點,根據自己值的奇偶性和當前陣列 odd 和 even 指標指向...

玩轉演算法面試 (三)LeetCode陣列類問題

陣列中的問題其實最常見。排序 選擇排序 插入排序 歸併排序 快速排序 查詢 二分查詢法 資料結構 棧 佇列 堆 templateint binarysearch t arr,int n,t target return 1 改變變數的定義,依然可以寫出正確的演算法templateint binarys...