头条面试题-统计有序数组里平方和的数目

给你一个有序整数数组,数组中的数可以是正数、负数、零,请实现一个函数,这个函数返回一个整数:返回这个数组所有数的平方值中有多少种不同的取值。举例:

  1. nums = {-1,1,1,1},

    那么你应该返回的是:1。因为这个数组所有数的平方取值都是1,只有一种取值

  2. nums = {-1,0,1,2,3}

    你应该返回4,因为nums数组所有元素的平方值一共4种取值:1,0,4,9

在往下看之前,请先进行思考,如果当时是你在面试,你会给出什么样的结题思路?下面会给出两种解法,最优解:时间复杂度:O(n)、空间复杂度O(1)。无论有没有思路,在往下看之前一定要有自己的思考

分析:

方法一:暴力法,先算平方和,保存在一个数组中,然后使用集合统计不同。

方法二:集合保存平方和。直接先遍历一次得到平方和,将平方和放入集合中,输出集合的大小。时间复杂度为O(n),空间复杂度为O(n).

方法三:以上两种方法都没有使用到数组有序,需要计算的是不同的平方和,那么平方和相同时有两种情况,一:两个元素是相邻元素,元素值本身相同;二:两个元素绝对值相等;对于第一种情况可以直接比较是否与相邻元素相等,相等时不计数;对于第二种情况利用数组有序的条件,使用双指针分别指向数组的头和尾,相等时不计数。两指针向中间移动。

 

public static int DifferentMi(int nums[]){
        int cnt=0;
        int i=0,j=nums.length-1;
        while(i<j){
            while(i<j && nums[i]*nums[i]==nums[j]*nums[j])
                i++;
            if(nums[i]*nums[i]>nums[j]*nums[j]){
                while(i<j && nums[i]*nums[i]==nums[i+1]*nums[i+1])
                    i++;
                i++;
            }else{
                while(i<j && nums[j]*nums[j]==nums[j-1]*nums[j-1])
                    j--;
                j--;
            }
            cnt++;
        }
        return cnt;
    }

 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值