首页 > 代码库 > 有序数组每个数平方后,不同数字的个数?O(n)

有序数组每个数平方后,不同数字的个数?O(n)

此乃一道笔试题,当时的确也出来啦。(但是在细节上还是出错啦,对多次重复出现的数字可能会重复计数,没有记录上次删除的元素)

 

如题,有序数组,可以知道平方之后在两边的数据较大,中间的数据较小。

          

因此可以使用两个下标,从两边向中间扫描。将绝对值大的数字删掉,计数即可,并记录刚才删除的数值的绝对值,以免出现多次相同的数据,重复计数的问题。

具体看完整代码:

 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5  6 int squareUniqueNum(vector<int> &ver){ 7     int len = ver.size(); 8     if(len < 2) 9         return len;10 11     int i = 0;12     int j = len - 1;13     int pre = abs(ver[0]);  ///记录上次删除数据的绝对值14     int num = 1;    ///数字为 115     while(i<=j){16         ///每次删除绝对值较大的数字,并记录下删除是数字的绝对值,绝对值相同的只计数一次17         if(abs(ver[i]) > abs(ver[j])){18             if(pre != abs(ver[i])){ ///如果没有删过19                 num++;20                 pre = abs(ver[i]);21             }22             i++;23         }24         else{25             if(pre != abs(ver[j])){ ///如果没有删过26                 num++;27                 pre = abs(ver[j]);28             }29             j--;30         }31     }32     return num;33 }34 35 int main()36 {37     vector<int> ver({-5,-3,-1,1,1,2});38     int num = squareUniqueNum(ver);    ///求有序数组中数字平方后,消重结果中数字的个数39     cout<<num<<endl;40     return 0;41 }

 

有序数组每个数平方后,不同数字的个数?O(n)