算法--有序數組的不同絕對值個數
阿新 • • 發佈:2017-10-29
[] 絕對值 空間復雜度 tin 如果 tabs continue dex 分析
題目:
給定一個有序數組, 求它的元素的絕對值個數. 如數組[-3, -1, 0, 0, 2, 3, 5], 返回5.
分析:
第一種思路. 數組遍歷一遍, 將每一個元素的絕對值放入一個Set裏面, 最後求Set的大小. 這種方法雖然很簡單, 但是空間復雜度不小, 為O(n). 那麽能不能同樣只遍歷一遍, 空間復雜度為O(1)呢. 好吧, 下面來分析一下時間復雜度為O(n), 空間復雜度為O(1)的方法. 假設一下, 如果數組裏面每一個元素的絕對值都不相同, 那麽在遍歷到第個元素的時候都令計數count加1, 那麽最後的結果也是絕對值個數, 對吧? 如果有相鄰兩個相同的元素呢? 那麽可以跳過這個元素不進行計數. 如果有正負兩個元素絕對值相對呢? 那麽這兩個元素的和為0對吧, 然後令遍歷的兩個index, 小的加1, 大的減1, 同時count只計算一個數就可以了. 對吧?
接下來我們來看一下具體的Java代碼吧:
1 public int countDistinctAbs(int[] nums) { 2 if (nums == null || nums.length == 0) { 3 return -1; 4 } 5 int i, j, count; 6 i = 0; 7 j = nums.length - 1; 8 count = 0; 9 while(i < j) { 10 if (i < nums.length - 1 && nums[i] == nums[i+1]) {11 continue; 12 } 13 if (j > 0 && nums[j] == nums[j-1]) { 14 continue; 15 } 16 if (nums[i]+nums[j] == 0){ //正負兩個數的絕對值相同, 如果數組只存在正數或者負數, 則不存在這種情況, if分支會走到下面兩種情況 17 i++; 18 j--; 19 } else if (nums[i] + nums[j] > 0) { //說明正數的絕對值較大, 或者全是正數時, 只走該分支 20 j--; 21 } else if (nums[i] + nums[j] < 0) { // 說明負數的絕對值較大, 或者命題負數時, 只走該分支 22 i++; 23 } 24 count++ 25 } 26 return count; 27 }
又解決了一道題目!!! 哈哈
算法--有序數組的不同絕對值個數