題目連結(jié):
題目意譯:
給定一個(gè)按非遞減順序排序的陣列 nums,回傳正整數(shù)數(shù)量與負(fù)整數(shù)數(shù)量?jī)蓴?shù)的最大值。
換句話說(shuō),如果 nums 中正整數(shù)的數(shù)量為 pos 而負(fù)整數(shù)的數(shù)量為 neg,則回傳 pos 和 neg 中的最大值。
注意到 0 不正也不負(fù)。
限制:
1 ≦ nums.length ≦ 2000
-2000 ≦ nums[i] ≦ 2000
nums 是以非遞減順序排序的。
進(jìn)階:你可以在時(shí)間複雜度為 O(lon(n)) 的情況下解出本題嗎?
範(fàn)例測(cè)資:
範(fàn)例 1:
輸入: nums = [-2,-1,-1,1,2,3]
輸出: 3
解釋: There are 3 positive integers and 3 negative integers. The maximum count among them is 3.
範(fàn)例 2:
輸入: nums = [-3,-2,-1,0,0,1,2]
輸出: 3
解釋: There are 2 positive integers and 3 negative integers. The maximum count among them is 3.
範(fàn)例 3:
輸入: nums = [5,20,66,1314]
輸出: 4
解釋: There are 4 positive integers and 0 negative integers. The maximum count among them is 4.
解題思維:
線性解很簡(jiǎn)單,就是單純地掃過(guò)並統(tǒng)計(jì)正數(shù)和負(fù)數(shù)各自的數(shù)量,最後再比較即可。
而 O(log(n)) 的解則需要利用 nums 是以非遞減順序排序的這個(gè)性質(zhì)——也就是用兩次二分搜來(lái)找到「最小的正整數(shù)」以及「最大的負(fù)整數(shù)」各自的位置,稱其為 x 和 y。前者可以視為第一個(gè)大於 0 的數(shù)字、後者為第一個(gè)大於等於 0 的數(shù)字之前一個(gè)數(shù)字,所以可以分別用 upper_bound() 和 lower_bound() 來(lái)找(這是以 C++ 為準(zhǔn);若是 Python 則是 bisect_left() 和 bisect_right())。
如果找不到最小的正整數(shù),則回傳 y + 1(沒(méi)有負(fù)整數(shù)的話,則此視為 0。後面也是同理);
如果連 0 都找不到,代表整個(gè)陣列都是負(fù)數(shù),因此回傳 nums.length 即可;
剩下的直接回傳 max(nums.length - x, y + 1) 即可。
此次分享到此為止,如有任何更加簡(jiǎn)潔的想法或是有說(shuō)明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。