Leetcode P1409 查詢帶鍵的排列

2021-10-24 15:36:20 字數 1970 閱讀 1995

給你乙個待查陣列 queries ,陣列中的元素為 1 到 m 之間的正整數。 請你根據以下規則處理所有待查項 queries[i](從 i=0 到 i=queries.length-1):

請你以陣列形式返回待查陣列 queries 的查詢結果。

示例 1:

輸入:queries =[3

,1,2

,1], m =

5輸出:[2,

1,2,

1] 解釋:待查陣列 queries 處理如下:

對於 i=

0: queries[i]=3

, p=[1

,2,3

,4,5

],3 在 p 中的位置是 2,接著我們把 3 移動到 p 的起始位置,得到 p=[3

,1,2

,4,5

] 。對於 i=

1: queries[i]=1

, p=[3

,1,2

,4,5

],1 在 p 中的位置是 1,接著我們把 1 移動到 p 的起始位置,得到 p=[1

,3,2

,4,5

] 。

對於 i=

2: queries[i]=2

, p=[1

,3,2

,4,5

],2 在 p 中的位置是 2,接著我們把 2 移動到 p 的起始位置,得到 p=[2

,1,3

,4,5

] 。對於 i=

3: queries[i]=1

, p=[2

,1,3

,4,5

],1 在 p 中的位置是 1,接著我們把 1 移動到 p 的起始位置,得到 p=[1

,2,3

,4,5

] 。

因此,返回的結果陣列為 [2,

1,2,

1] 。

示例 2:

輸入:queries =[4

,1,2

,2], m =

4輸出:[3,

1,2,

0]

示例 3:

輸入:queries =[7

,5,5

,8,3

], m =

8輸出:[6,

5,0,

7,5]

這道題當然用暴力可以很容易地過,但是要想到乙個比較好的解法就沒那麼顯然了。

可以想一下多次queries的過程,每次會提出來乙個數放在最前面,那可以想像有乙個長度為n+m的陣列,其中n為queries的長度。一開始m個元素放在最後m個位置,每次提出來的元素會依次向前放。每次返回的內容相當於是,該元素之前有多少個元素。

那麼可以把這個長度為m+n的陣列用乙個陣列標記每個位置是否有元素,1表示有,0表示沒有。每一次操作,如果我們維護每乙個元素當前的位置,就是先將乙個1置0,再將即將移動到的位置置1。而且每次移動到的位置都是固定的。最後看要返回的內容是該元素之前有多少元素,那就相當於統計該元素之前有幾個1,相當於對維護的這個陣列求和!

典型的單點更新,區間求和問題,直接樹狀陣列,**如下:

class

solution

void

update

(int i,

int x)

}int

getsum

(int i)

return res;

}

vector<

int>

processqueries

(vector<

int>

& queries,

int m)

vector<

int> res;

for(

int i =

1; i <= n; i++

)return res;}}

;

LeetCode P53題解 動態規劃

找出連續子區間最大和,至少包含乙個數 例如 2,1,3,4,1,2,1,5,4 則子區間 4,1,2,1 有最大和為6 如上圖p1.1 最優解一定為一段連續的區間,則可以有o n n 的解法,即遍歷所有的區間找出最大值 設sum i 為區間 1,i 的和,初始化處理 最優解 max sum i su...

LeetCode P5 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 這個題讓我學會一種方法 中心擴充套件法,就是遍歷輸入的字串,以遍歷到的字元為中心,向兩邊同時擴充套件,...

LeetCode P63 不同路徑II

文章參考leetcode官方題解 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?網格中的障礙物和空位置分...