這類題目有點特別,不要求我們對陣列元素進行像正常排序那樣從大到小或者從小到大,而是要求我們使用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...