序数组中不同平方值的个数(头条面试题)

题目:求解一个有序数组不同平方值的个数,{-1,-1,0,1,1}这里平方值只有0,1两种情况,返回2;{-3,-1,0,0,2,3}这里拼房族有0,1,4,9共4中情况,返回4。
要求:时间复杂度O(n)空间复杂度O(1)

分析:

有序数组普遍是利用双指针问题求解

其次,map(或哈希)、二分

跟指定target类似,这里的target=0.每次检查头尾指针的和是等于0、大于0还是小于0.根据这3中情况分析。注意数字可能重复,需要去重。

// 返回平方后不同元素的个数
int diffSqureNum(const vector<int>& nums)
{
    if(!nums.size())  return 0;
    int l = 0, r = nums.size()-1;
    int cnt = 0;
    while(l <= r)
    {
        if(nums[l]+nums[r] == 0)
        {
            cnt++;
            int tmp = nums[l];
            while(l <= r && nums[l] == tmp)  l++;
            while(l <= r && nums[r] == -tmp)  r--;
        }
        else if(nums[l]+nums[r] > 0)
        {
            cnt++;
            int tmp = nums[r];
            while(l <= r && nums[r] == tmp)  r--;
        }
        else
        {
            cnt++;
            int tmp = nums[l];
            while(l <= r && nums[l] == tmp) l++;
        }
    }
    return cnt;
}

参考链接:https://blog.csdn.net/qq_42673507/article/details/90673318

猜你喜欢

转载自www.cnblogs.com/lfri/p/12572340.html