給你乙個待查陣列 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 現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?網格中的障礙物和空位置分...