序数组中不同平方值的个数(头条面试题)
题目:求解一个有序数组不同平方值的个数,{-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
个性签名:时间会解决一切