最近,一个好久没联系的老同学突然给我吐槽,天天在实验室里给老板打工,没时间刷题。这不刚刚面试完一家大厂,就被秀的体无完肤!面对老同学的抱怨,我深有体会!

阿里面试官:不会衡量复杂度的程序员,我们不需要!-LMLPHP
在这里,温馨提醒一下,将要找工作的同学们,有空一定要多补补 算法与数据结构 。避免掉入 “一看就会,一写就凉" 的陷阱,打破 “只会暴力求解,不会衡量复杂度” 的尴尬局面!

废话就不多说了,下面进入正题!(PS:下面以张三指代老同学)


首先进去是一分钟的自我介绍,接着就进入了 “手撕代码” 环节。还没等张三反应过来,一道题目就迎面而来。

题目大概是这样的:

看完题目后,张三窃喜(心想这么简单的题,还能难住我?)。说时迟,那时快!没用几分钟,就一顿写完了。

张三:面试官,我写完了,您看一下!(脸上洋溢着得意的表情~)

面试官:好的,我看看~

内容是这样的:

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
    	vector<int> result;  //存放所有可能的中心索引
    	int flag = 0; //标志位:存在中心索引置1,否则置0
        for(int i=0; i<nums.size(); i++){
            long sum1=0, sum2=0;  //初始化元素左边总和、右边总和
            //计算左边总和
            for(int j=0; j<i; j++)
                sum1+=nums[j];
            //计算右边总和
            for(int k=i+1; k<nums.size(); k++)
                sum2+=nums[k];
            //如果相等,则索引i是中心索引  
            if(sum1==sum2){
                result.push_back(i);
                flag = 1 //存在中心索引,标志位置1
            }
        }
        if(flag)
        	return result[0];//如果存在中心索引,则返回最靠近左边的那个索引
        else
        	return -1//不存在中心索引,那么返回 -1
    }
};

看完之后,面试官脸色有点凝重。。

面试官:再仔细看一下题,你觉得需要单独开辟一个空间去存储结果吗?

张三:恩。。可能不需要,我再想想!(一边摸着头脑,一边打量着题目)

知道问题后,张三马上将程序进行了优化,内容是下面这样:

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        for(int i=0; i<nums.size(); i++){
        	//初始化
            int sum1=0,sum2=0;
            //计算左边元素总和
            for(int j=0; j<i; j++)
                sum1+=nums[j];
            //计算右边元素总和
            for(int k=i+1; k<nums.size(); k++)
                sum2+=nums[k];
            if(sum1==sum2){
                return i;  //返回中心索引
            }
        }
        return -1; //不存在中心索引,则返回-1
    }
};

面试官看完后,表情终于松弛了下来。但是对这个结果还是不太满意!

面试官: 你的这种方法,空间复杂度是 O ( 1 ) O(1) O(1),但是时间复杂度是 O ( n 2 ) O(n^2) O(n2),你能再优化一下吗?

张三又看了看题目,没有什么思路。

张三恍然大悟,连忙说:谢谢指导,我想我应该有办法了!

于是不一会儿功夫,再次将代码进行了优化,最终结果如下:

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int sum=0, sum1=0, sum2=0;
        //计算数组总和
        for(int i=0; i<nums.size(); i++)
            sum += nums[i];
        //寻找第一个中心索引
        for(int i=0; i<nums.size(); i++){
            sum2 = sum - nums[i] - sum1; //右边累计和
            if(sum1==sum2)
                return i;
            sum1 += nums[i]; //左边累计和
        }
        return -1;
    }
};

看完之后,面试官才露出了微微的笑容~

当然,这可能也不是最优解。优秀的你们,如果有更好的解法,可以在评论区留言!


相关文章推荐

算法与数据结构专栏:从小白到入门,从人门到大神!

09-02 17:35