今日头条第二道编程题


代码与测试:
#include <iostream>
#include <vector>
#include <stack>
#include <time.h>
#include <algorithm>
using namespace std;
int vecSum(vector<int> &num, int i, int j)//计算num[i]到num[j]的和 
{
	int sum=0;
	for (int k = i; k <= j; k++) {
		sum += num[k];
	}
	return sum;
}
int incr_stack(vector<int> &num) {//单调栈实现 
	stack<int> s;
	int sum = 0;
	int maxSum = INT_MIN;
	int n = num.size();
	for (int i = 0; i<n; i++) {
		if (s.empty() || num[i] >=num[s.top()]) {
			s.push(i);
		}
		else {
			while (!s.empty() && num[s.top()] >=num[i]) {
				int top = s.top();
				s.pop();
				int tmp=s.empty()? vecSum(num, 0, i-1) : vecSum(num, s.top()+ 1, i - 1);
				int curSum = num[top]*tmp;
				maxSum = max(curSum, maxSum);
			}
			s.push(i);
		}
	}
	while (!s.empty()) {
		int top = s.top();
		s.pop();
		int tmp=s.empty()? vecSum(num, 0, n-1): vecSum(num, s.top()+ 1, n - 1);
		int curSum =  num[top]*tmp;
		maxSum = max(curSum, maxSum);
	}
	return maxSum;
}
int enum_method(vector<int> &num) {//穷举方法,用于测试 
	int n = num.size();
	int maxSum = INT_MIN;
	vector<int> tmp;
	for (int i = 0; i<n; ++i) {
		for (int j = i; j<n; ++j) {
			tmp.clear();
			for (int k = i; k <= j; ++k) {
				tmp.push_back(num[k]);
			}
			sort(tmp.begin(), tmp.end());
			int curSum = tmp[0] * vecSum(tmp, 0, tmp.size() - 1);
			maxSum = max(curSum, maxSum);
		}
	}
	return maxSum;
}
vector<int> getRandomArray(int len) {//随机产生数组 
	vector<int> res;
	if (len<0)
		return res;
	res.reserve(len);
	srand((unsigned)time(NULL));  
	for (int i = 0; i<len; i++) {
		res.push_back(rand() % 100);
	}
	return res;
}
void printArray(vector<int> arr) {//用于测试 

	for (int i = 0; i<arr.size(); i++) {
		cout << arr[i] << " ";
	}
	cout << endl;
}
int main()
{
	bool flag=true;
	for(int i=1;i<200;i++){
		vector<int> num = getRandomArray(i);
		//printArray(num);
		int res1=enum_method(num);
		int res2=incr_stack(num);
		if(res1!=res2){
			flag=false;
			break;
		}	 
	}
	if(flag)
		cout<<"true"<<endl;
	else
		cout<<"false"<<endl;
}

全部评论
import java.util.*; public class Main { public static void main(String[] args) throws ParseException {     Scanner sc = new Scanner(System.in);     while (sc.hasNext()) {        int N=sc.nextInt();        int []in=new int[N];        for(int i=0;i<N;i++){            in[i]=sc.nextInt();        }        System.out.println(getMax(in));     } } //得到min*sum最大的子数组 public  static int getMax(int [] nums){     if(nums==null||nums.length==0)         return 0;     int len=nums.length;     int []tmpSum=new int[len+1];     int sum=0;     for(int i=0;i<len;i++){         sum+=nums[i];         tmpSum[i+1]=sum;     }     return getCurrentMax(tmpSum,nums,0,len-1); } public static  int getCurrentMax(int []tmpSum,int []nums,int i,int j){     if(i>=j){         return nums[i]*nums[i];     }     int indexOfTmpMin=getMinFromArray(nums,i,j);     int tmpMin=nums[indexOfTmpMin];  // 当前最小值     int currentSum=tmpSum[j+1]-tmpSum[i];     return Math.max(currentSum,Math.max(getCurrentMax(tmpSum,nums,i,indexOfTmpMin-1),getCurrentMax(tmpSum,nums,indexOfTmpMin+1,j))); } public static  int getMinFromArray(int []nums,int i,int j){     int min=Integer.MAX_VALUE;     int loc=0;     for(int k=i;k<=j;k++){         if(nums[k]<min){             min=nums[k];             loc=k;         }     }     return loc; } }
点赞 回复 分享
发布于 2017-08-24 22:38
我的做法也是这样的,但是我没有参加这个笔试,我想知道哪里有原题可以测试一下自己的代码
点赞 回复 分享
发布于 2017-08-24 13:09
单调栈复杂度多少
点赞 回复 分享
发布于 2017-08-23 20:20

相关推荐

吴offer选手:学到了,下次面试也放张纸在电脑上,不然老是忘记要说哪几个点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务