字节面试--教育后端,两道基础算法题总结

字节面试–教育后端,两道基础算法题总结

二叉树前序非递归遍历代码,pop()返回值

strcut NTree{
	int data;
	struct NTree *left,*right;
	NTree(int x):data = x,left(NULLL),right(NULL){}
}NTrode;
void PreOrder(NTrode * T){
	NTrode * p = T;
	stack<NTrode *>rec;
	
	while(!rec.empty() || p){
		if(p){
			visit(p);//visit是访问该节点,输出节点数据
			rec.push(p);
			p = p->left;
		}
		else{
			p = rec.top(); 
			rec.pop();
			p = p->right;
		}//if...else
	}//while
	return;
}

C++的STL库中的stack中pop()仅返回void的原因

  else{
   	p = rec.top(); 
   	rec.pop();
   	p = p->right;
  }//if...else

刚开始看C++标准程序库时,也是感觉到有点小奇怪,原先一直认为pop()是返回栈顶元素同时将该元素从栈中删除。但是,实际在C++语言中不是这样的,pop()无返回值返回void。
主要原因有两个:

  1. 安全原因
    先假设pop()返回栈顶元素,同时将该元素从栈中删除。

    Stack sta;
    sta.push(object);
    Object obj = sta.pop();
    

    那么,当执行Object obj = sta.pop() 时,Object的构造函数被调用时发生异 常,此时,pop()已经执行完毕,栈顶元素删除动作无法回退。

  2. 效率原因
    当栈顶元素被弹出后,我们必须返回该元素的值,而不可以采用引用的方法(因为该元素已经删除),因此Object obj 必须再发生一次实例化。我们再对比分析一下,top()仅返回栈顶元素不删除,那么可以采用引用,避免一次实例化。所以,从效率角度来看,pop()最好不要返回值。

ps:一段官方解释
One might wonder why pop() returns void, instead of value_type. That is, why must one use top() and pop() to examine and remove the top element, instead of combining the two in a single member function? In fact, there is a good reason for this design. If pop() returned the top element, it would have to return by value rather than by reference: return by reference would create a dangling pointer. Return by value, however, is inefficient: it involves at least one redundant copy constructor call. Since it is impossible for pop() to return a value in such a way as to be both efficient and correct, it is more sensible for it to return no value at all and to require clients to use top() to inspect the value at the top of the stack.

最大子序和(LeetCode 53)

题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

int maxSubArray(vector<int>& nums) {     
    int rec = 0;      
    int ans = INT_MIN;
    
    for(int x:nums){           
    	rec = max(rec+x,x);           
    	ans = max(ans,rec);       
    }//for  
        
    return ans;
}    

采用动态规划思想。(还有一种分治思想题解-类似线段树)
既然是动态规划问题,那么该问题最关键的就是找出状态转移方程。

N :表示总共给出N个元素,从下标0开始
i :标量,(0,N-1)
a(i):表示N个元素中的第i个
f(i): 以第 i 个元素结尾的连续子数组的最大和

那么本题的答案就是f(0)到f(N-1)的N个数的最大值。接下来就是如何求取f(i),f(i)可以由两个方向转变而成,一个是f(i-1)+a(i),另一个就是a(i);因此
f(i) = max{f(i-1)+a(i),a(i)}
时间复杂度O(n),空间复杂度O(1)

限于个人水平,难免出现说明错误或讲解不详的地方,欢迎私聊指正。

你可能感兴趣的:(算法leetcode)