1. 程式人生 > >算法--有序數組的不同絕對值個數

算法--有序數組的不同絕對值個數

[] 絕對值 空間復雜度 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 }

又解決了一道題目!!! 哈哈

算法--有序數組的不同絕對值個數