excel表格求最大值的问题

60.216.11.*
直接MAX(字段),人家都实现好了,你再编程序多此一举吧
还是很麻烦啊,和写个程序差不多了,就没有直接可用的函数或语句?
(表)
不知道,试试
您的举报已经提交成功,我们将尽快处理,谢谢!
例如rs("变量")是你从记录某字段取出来的,用于SQL语句:
如果变量是字符串:
sql="Select * from [user] where name...
大家还关注
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'博客访问: 800823
博文数量: 221
博客积分: 5174
博客等级: 大校
技术积分: 2057
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 数据库开发技术
<FONT color=#.需求原型:有如下数据,要自动生成第三列。
<FONT color=#.分析困难:
a.数据记录很多,不能手工逐条去对比,必须用计算机来快速筛选。
b.数据内容不确定,计算的过程应允许重复。
c.问题:分组 找最小值 或者 找最大值
<FONT color=#.解决办法:
统计函数,在C列中输入公式,=IF(B2=MIN(IF($A$1:$A$2092=$A2,$B$1:$B$2092)),"最小值","")
然后按ctrl + shift + enter键,进行统计。
a.2092是表格的最大行数,可以根据实际修改
b.先分组取最小值 min(if($A$1:$A$2092 =$A2,$B$1:$B$2092))
c.比较B2与取得最小值,打标记。
阅读(2620) | 评论(2) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
谢谢,受用啦
楼主太牛了!试了下真可以。。。就是还是不明白为啥要ctrl+shift+enter
请登录后评论。三种方法求最大子数组的和 - 推酷
三种方法求最大子数组的和
转载请注明出处:
& & 这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典。
& & 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8。
& & 下面按照时间复杂度逐步优化的顺序依次给出这三种算法。
暴力求解法
& & 该方法的思想非常简单,先找出从第1个元素开始的最大子数组,而后再从第2个元素开始找出从第2个元素开始的最大子数组,依次类推,比较得出最大的子数组。实现代码如下:
常规方法,时间复杂度O(n*n)
先从第一个元素开始向后累加,
每次累加后与之前的和比较,保留最大值,
再从第二个元素开始向后累加,以此类推。
int MaxSubSum1(int *arr,int len)
int MaxSum = 0;
//每次开始累加的起始位置的循环
for(i=0;i&i++)
int CurSum = 0;
//向后累加的循环
for(j=i;j&j++)
CurSum += arr[j];
if(CurSum & MaxSum)
MaxSum = CurS
return MaxS
& & 很明显地可以看出,该方法的时间复杂度为O(n*n)。
分治求解法
& & 考虑将数组从中间分为两个子数组,则最大子数组必然出现在以下三种情况之一:
& & 1、完全位于左边的数组中。
& & 2、完全位于右边的数组中。
& & 3、跨越中点,包含左右数组中靠近中点的部分。
& & 递归将左右子数组再分别分成两个数组,直到子数组中只含有一个元素,退出每层递归前,返回上面三种情况中的最大值。实现代码如下:
求三个数中的最大值
int Max3(int a,int b,int c)
if(b & Max)
if(c & Max)
次优算法,采用分治策略
int MaxSubSum2(int *arr,int left,int right)
int MaxLeftSum,MaxRightS //左右边的最大和
int MaxLeftBorderSum,MaxRightBorderS //含中间边界的左右部分最大和
int LeftBorderSum,RightBorderS //含中间边界的左右部分当前和
//递归到最后的基本情况
if(left == right)
if(arr[left]&0)
return arr[left];
//求含中间边界的左右部分的最大值
center = (left + right)/2;
MaxLeftBorderSum = 0;
LeftBorderSum = 0;
for(i=i&=i--)
LeftBorderSum += arr[i];
if(LeftBorderSum & MaxLeftBorderSum)
MaxLeftBorderSum = LeftBorderS
MaxRightBorderSum = 0;
RightBorderSum = 0;
for(i=center+1;i&=i++)
RightBorderSum += arr[i];
if(RightBorderSum & MaxRightBorderSum)
MaxRightBorderSum = RightBorderS
//递归求左右部分最大值
MaxLeftSum = MaxSubSum2(arr,left,center);
MaxRightSum = MaxSubSum2(arr,center+1,right);
//返回三者中的最大值
return Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum+MaxRightBorderSum);
将分支策略实现的算法封装起来
int MaxSubSum2_1(int *arr,int len)
return MaxSubSum2(arr,0,len-1);
& & 设该算法的时间复杂度为T(n),则:
T(n)= 2T(n/2)+ O(n),且T(1)= 1。
& & 逐步递推得到时间复杂度T(n)= O(nlogn)。
线性时间算法
& & 该算法在每次元素累加和小于0时,从下一个元素重新开始累加。实现代码如下:
最优方法,时间复杂度O(n)
和最大的子序列的第一个元素肯定是正数
因为元素有正有负,因此子序列的最大和一定大于0
int MaxSubSum3(int *arr,int len)
int MaxSum = 0;
int CurSum = 0;
for(i=0;i&i++)
CurSum += arr[i];
if(CurSum & MaxSum)
MaxSum = CurS
//如果累加和出现小于0的情况,
//则和最大的子序列肯定不可能包含前面的元素,
//这时将累加和置0,从下个元素重新开始累加
if(CurSum & 0)
CurSum = 0;
return MaxS
& & 显然,该算法的时间复杂度O(n)。该算法理解起来应该不难,但是要想出来可就不容易了。另外,该算法的一个附带的有点是:它只对数据进行一次扫描,一旦元素被读入并被处理,它就不再需要被记忆。因此,如果数组在磁盘或磁带上,他就可以被顺序读入,在主存中不必存储数组的任何部分。不仅如此,在任意时刻,该算法都能对它已经读入的数据给出最大子数组(另外两种算法不具有这种特性)。具有这种特性的算法叫做联机算法。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致,则最大子序列和为20。
,则最大子序列和为16。
//穷举法,复杂度O(n^3)&
long maxSubSum1(const vector&int&& a)&
&&&&&& long maxSum = 0;&
&&&&&& for (int i = 0; i & a.size(); i++)&
&&&&&&&&&&&&& for (int j = j & a.size(); j++)&
&&&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&&& long thisSum = 0;&
&&&&&&&&&&&&&&&&&&&& for (int k = k &= k++)&
&&&&&&&&&&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&&&&&&&&&& thisSum += a[k];&
&&&&&&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&&&&&&& if (thisSum & maxSum)&
&&&&&&&&&&&&&&&&&&&&&&&&&&& maxSum = thisS&
&&&&&&&&&&&&& }&
&&&&&& return maxS&
循环来避免三次时间。
//也是穷举法,不过减去了上面的一些不必要操作O(n^2)&
long maxSubSum2(const vector&int&& a)&
&&&&&& long maxSum = 0;&
&&&&&& for (int i = 0; i & a.size(); i++)&
&&&&&&&&&&&&& long thisSum = 0;&
&&&&&&&&&&&&& for (int j = j & a.size(); j++)&
&&&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&&& thisSum += a[j];&
&&&&&&&&&&&&&&&&&&&& if (thisSum & maxSum)&
&&&&&&&&&&&&&&&&&&&&&&&&&&& maxSum = thisS&
&&&&&&&&&&&&& }&
&&&&&& return maxS&
分治策略&#8221;(
//递归法,复杂度是O(nlogn)&
long maxSumRec(const vector&int&& a, int left, int right)&
&&&&&& if (left == right)&
&&&&&&&&&&&&& if (a[left] & 0)&
&&&&&&&&&&&&&&&&&&&& return a[left];&
&&&&&&&&&&&&& else&
&&&&&&&&&&&&&&&&&&&& return 0;&
&&&&&& int center = (left + right) / 2;&
&&&&&& long maxLeftSum = maxSumRec(a, left, center);&
&&&&&& long maxRightSum = maxSumRec(a, center+1, right);&
&&&&&& //求出以左边对后一个数字结尾的序列最大值&
&&&&&& long maxLeftBorderSum = 0, leftBorderSum = 0;&
&&&&&& for (int i = i &= i--)&
&&&&&&&&&&&&& leftBorderSum += a[i];&
&&&&&&&&&&&&& if (leftBorderSum & maxLeftBorderSum)&
&&&&&&&&&&&&&&&&&&&& maxLeftBorderSum = leftBorderS&
&&&&&& //求出以右边对后一个数字结尾的序列最大值&
&&&&&& long maxRightBorderSum = 0, rightBorderSum = 0;&
&&&&&& for (int j = center+1; j &= j++)&
&&&&&&&&&&&&& rightBorderSum += a[j];&
&&&&&&&&&&&&& if (rightBorderSum & maxRightBorderSum)&
&&&&&&&&&&&&&&&&&&&& maxRightBorderSum = rightBorderS&
&&&&&& return max3(maxLeftSum, maxRightSum, &
&&&&&&&&&&&&& maxLeftBorderSum + maxRightBorderSum);&
long maxSubSum3(const vector&int&& a)&
&&&&&& return maxSumRec(a, 0, a.size()-1);&
//求出三个long中的最大值&
long max3(long a, long b, long c)&
&&&&&& if (a & b)&
&&&&&&&&&&&&& a =&
&&&&&& if (a & c)&
&&&&&&&&&&&&& return&
&&&&&& else&
&&&&&&&&&&&&& return&
T(N) = 2T(N/2) + O(N)&
//线性的算法O(N)&
long maxSubSum4(const vector&int&& a)&
&&&&&& long maxSum = 0, thisSum = 0;&
&&&&&& for (int j = 0; j & a.size(); j++)&
&&&&&&&&&&&&& thisSum += a[j];&
&&&&&&&&&&&&& if (thisSum & maxSum)&
&&&&&&&&&&&&&&&&&&&& maxSum = thisS&
&&&&&&&&&&&&& else if (thisSum & 0)&
&&&&&&&&&&&&&&&&&&&& thisSum = 0;&
&&&&&& return maxS&
联机算法:在任意时刻算法都能够对它已读入的数据给出当前数据的解。&
//COUNT和MAX_NUM分别表示随机数个数和最大值&
const long COUNT = 1000;&
const int MAX_NUM = 200;&
bool readFile(vector&int&& input, string fileName)&
&&&&&& ifstream infile(fileName.c_str());&
&&&&&& if (!infile)&
&&&&&&&&&&&&& return false;&
&&&&&& int&
&&&&&& while(infile&&s)&
&&&&&&&&&&&&& input.push_back(s);&
&&&&&& return true;&
//写大量随机测试数据&
bool writeTestData(string fileName)&
&&&&&& ofstream outfile(fileName.c_str());&
&&&&&& if (!outfile)&
&&&&&&&&&&&&& return false;&
&&&&&& srand((unsigned)time(NULL));&
&&&&&& for (int i = 0; i & COUNT; i++)&
&&&&&&&&&&&&& if (rand() % 2 == 0)&
&&&&&& &&&&&&&&&&&&& outfile && rand() % MAX_NUM && '\n';&
&&&&&&&&&&&&& else&
&&&&&&&&&&&&&&&&&&&& outfile && ~(rand() % MAX_NUM) && '\n';&
&&&&&& return true;&
COUNT = 10000;
MAX_NUM = 200;
&& input, string fileName)
)time(NULL));
i = 0; i & COUNT; i++)
vector&int&& a)
i = 0; i & a.size(); i++)
j = j & a.size(); j++)
k = k &= k++)
vector&int&& a)
i = 0; i & a.size(); i++)
j = j & a.size(); j++)
a, long b, long c)
vector&int&& a, int left, int right)
i = i &= i--)
j = center+1; j &= j++)
vector&int&& a)
vector&int&& a)
j = 0; j & a.size(); j++)
(thisSum & 0)
阅读(...) 评论()

我要回帖

更多关于 excel表格求最大值 的文章

 

随机推荐