【題目描述】
Give you an integer array (index from 0 to n-1, where n is the size of this array, value from 0 to 10000) and an query list. For each query, give you an integer, return the number of element in the array that are smaller than the given integer.
Notice:We suggest you finish problem?Segment Tree Build?and?Segment Tree Query II? first.
給定一個(gè)整數(shù)數(shù)組 (下標(biāo)由 0 到 n-1,其中 n 表示數(shù)組的規(guī)模,數(shù)值范圍由 0 到 10000),以及一個(gè) 查詢列表。對(duì)于每一個(gè)查詢,將會(huì)給你一個(gè)整數(shù),請(qǐng)你返回該數(shù)組中小于給定整數(shù)的元素的數(shù)量。
【注】在做此題前,最好先完成線段樹的構(gòu)造和線段樹查詢 II這兩道題目。
【題目鏈接】
www.lintcode.com/en/problem/count-of-smaller-number/
【題目解析】
此題可以用排序+二分查找的方法來(lái)做。先對(duì)數(shù)組排序,然后對(duì)于每個(gè)查詢,用二分查找在數(shù)組中進(jìn)行查詢,找到原數(shù)組中第一個(gè)比查詢數(shù)大的數(shù),然后再?gòu)暮笸敖y(tǒng)計(jì)。
由于這道題目不是查找==而是選擇第一個(gè)>(num)的數(shù)的位置,所以while語(yǔ)句里面可以把>和=歸為同一個(gè)分支>=,因?yàn)?==)存在包含重復(fù)數(shù)(duplicate)的情況,所以要和>一樣,end指針前移替換mid。
那么另一個(gè)分支<,除了將start后移,還要更新返回值res。
第二點(diǎn),如果while循環(huán)的約束條件是start < end,假如循環(huán)到最后start = end - 1,并且num就在end呢?這時(shí)應(yīng)該返回res = start + 1,推測(cè)前一步,start = end - 2的時(shí)候,end的前移只能到mid為止,不能是mid - 1,否則就跳過了可能為所求結(jié)果的mid。
【參考答案】