h*********n 发帖数: 11319 | 1 能不能这样
首先找到范围内最小的heavy数,设为current
tencurrent = current
while tencurrent没有跨越尾数为00的边界,
tencurrent每次+9, 然后算tencurrent数到最近的个位为9的数之间的距离(包括俩端
点)
如果tenrtcurrent跨越了尾数为00边界,那么
hundredcurrent = current, 然后
while hundredcurrent没有跨越尾数为000的边界,
hundred每次+99,重复前一个循环
如果hundredtcurrent跨越了尾数为000边界,那么
thousandcurrent = current, 然后
while hundredcurrent没有跨越尾数为0000的边界,
hundred每次+999,重复前两个循环
。。。。。。
就这么一层层包下去直到边界的量级大于给出的范围
写起来好像挺复杂,真面试的时候我肯定得debug半天。。。 |
|
i**********e 发帖数: 1145 | 2 来自主题: JobHunting版 - 一道G家题 恩,不好意思
我仔细想了想,似乎 invariant 欠缺了一些重要的东西
用lz的例子:
1 2 3 5 6
后边贴一个 +infinity,让我们的 invariant 更简洁:
1 2 3 5 6 +INF
设 lo = 0, hi = n (5) (但实际上永远不会 access A[hi])
然后再折半查找:
invariant 的条件要改一改:
if (M-L >= A[M] - A[L])
L = M;
else
H = M;
终止条件比较 tricky,就是 H - L <= 1 的时候。 |
|
P**********c 发帖数: 3417 | 3 能解释下
p2 = (void**) (((size_t)(p1)+offset) & ~(alignment-1))
这句吗?前面的code基本上是说申请大小是
required_byes+offset大小的memory, p1指向这块memory.
我能理解这句把p2 转化成了alignment的倍数。保留了高位,把alignment之后的bit都设成0。但是这样p2指向的还是required_bytes大小的memory吗?
感觉p1+offset指向的才是required_bytes大小的memory啊。&之后还是吗?
还有p2[-1],这种情况下是p2前面多少byte? |
|
c****p 发帖数: 6474 | 4 &(p2[-1])=p2 - sizeof(void *);
都设成0。但是这样p2指向的还是required_bytes大小的memory吗? |
|
M**A 发帖数: 78 | 5 总结各位评论,欢迎拍砖。
题目
align_malloc(1000, 128) will return a memory address that is a multiple of
128 and that points to memory of size 1000 bytes.
aligned_free() will free memory allocated by align_malloc.
解答
int offset = alignment-1+sizeof(void*);//分配空间给a memory address that is
a multiple of 128
这个offset的空间用来存放memory address,就是*p1 that points to memory of
size 1000 bytes
p1 = (void*)malloc(required_bytes+offset)) //分配空间给memory of size 1000
bytes+memory address that is a multiple of
128, required_byt... 阅读全帖 |
|
g*****k 发帖数: 623 | 6 anysize_reader有一个静态buffer和一个静态index指向buffer起始位置。
当buffer中数据完全处理完毕,就调用block_reader(buffer)并且设index=0
这样即便有数据残留在buffer中,下次调用anysize_reader也是先处理buffer中的 |
|
P**********c 发帖数: 3417 | 7 这个好像不太对,上来就把x[i]设成-1, 后面应该判断是不是回到原位置了吧。 |
|
r*******g 发帖数: 1335 | 8 贪心不一定最优吧,假设先weight排序好,我们只看height,假设如下的hight
1,2,3,6,5,5.5,5.8
这个用贪心怎么求?明显结果是可选6个,但是如果简单把5设为unfit然后重新开始就
有问题。 |
|
a**********2 发帖数: 340 | 9 来自主题: JobHunting版 - 问个算法题 画一颗后缀树,建立过程中存在的节点就将这个节点加一,不存在就创建并设为1,最
后找出最大计数路径。
其实很好理解,后缀树是字符串所有后缀的字串的集合而成的,计数就相当于统计字串
的出现频率
连续的话用就不知道怎么弄了 |
|
i**********e 发帖数: 1145 | 10 来自主题: JobHunting版 - 问个算法题 Recursion + caching,可以转换成 bottom-up DP.
0000. F(0) = 0
0001. F(1) = 1
0010. F(2) = 2
0011. F(3) = 4
0100. F(4) = 5
0101. F(5) = 7
0110. F(6) = 9
0111. F(7) = 12 = (7-3) + 2*F(3) = 4 + 2*4 = 12
1000. F(8) = 13
...
1111. F(15) = (15-7) + 2*F(7) = 8 + 2*12 = 32
假设要找的是 F(N),那么首先设 k = ceil( log(N+1) )
建立表从 F(2^i - 1), i = 0 .. k , O(log N) 时间
然后计算 F(N) = N-(2^k - 1) + F(2^k - 1) |
|
l*y 发帖数: 21010 | 11 按三路归并的办法,把三个数组并成一个,在这个过程中就找到了所需triplet。
首先设minDistance为MAXINT。归并的过程中,每次选三个数组各自最小元素的最小的
拿出来放入归并好的序列。假设某时刻三个数组的最小元素分别为ai,bj,ck,且ai最小
,我们记录max(|ai-bj|,|ai-ck|)的值。这个值就是在最后归并好的序列中,以ai为最
小数的triplet的Distance(可用反证法证明,因为bj和ck分别是另外两个数组中比ai
大的最小的数,所以再取更大的数Distance一定更大),记为curDistance,然后更新
minDistance如果比它更小(并且记住该minDistance对应的triplet是ai,bj,ck)。
完成归并后,我们就得到了minDistance和所需的那个triplet。
distance |
|
m**a 发帖数: 139 | 12 假设有n个数组。 每个数组设一个pointer 指向开始。计算n个书中的最小距离(最大
值减最小值),如果比global的小,更新global。向后指向n个数中最小的那个的
pointer。重复知道所有pointer都指向数组末。 |
|
z********c 发帖数: 72 | 13 我的想法
F[i][j]为S的substring最后取得位置是i,T的sub sequence最后取得位置是j,匹配的
方案数
1. S[i]!=T[j],则F[i][j]=0
2. S[i]==T[j],则
a. i和j分别都是各自的第一个字符,方案数1
b. i和j不是第一个字符,那么方案数F[i - 1][k] k < j
so
F[i][j] = 1 + sum (F[i - 1][1] + F[i - 1][2] .. F[i][j - 1])
设
S[i][j] = F[i][1] + F[i][2] + ... F[i][j]
所以
F[i][j] = 1 + S[i - 1][j - 1]
S[i][j] = S[i][j - 1] + F[i][j]
answer = sigma (F[i][j]), i <= len (s), j <= len(t) |
|
m******6 发帖数: 82 | 14 1.找到最小的>0的数,然后设为pivot
2.然后做一次in-place partition
不知道对不对
1) |
|
w****o 发帖数: 2260 | 15 yishan,
我觉得你的方法不行。可能是我没有太理解。
举个简单的例子,
比如一个数组, 5 5 5
第一遍:
第一个5出现的时候,你把 bitflag[5] = 1
第二个5出现的时候,bitflag[5]仍是1, 同时数组变成了 5 -5 5
第三个5出现的时候,bitflag[5]仍是1, 同时数组变成了 5 -5 -5
到这里我的理解是对的吗?
可是你的第二遍,我就没有弄明白了。
第二遍:
遇到5,bitflag[5]是1,数组不做改动,仍是5 -5 -5
然后遇到-5, 怎么办?设bitflag[5]=0?,数组变成 5 5 -5?
然后遇到-5,怎么办?
你什么时候判断5是出现了几次?
谢谢! |
|
w****o 发帖数: 2260 | 16 yishan,
我觉得你的方法不行。可能是我没有太理解。
举个简单的例子,
比如一个数组, 5 5 5
第一遍:
第一个5出现的时候,你把 bitflag[5] = 1
第二个5出现的时候,bitflag[5]仍是1, 同时数组变成了 5 -5 5
第三个5出现的时候,bitflag[5]仍是1, 同时数组变成了 5 -5 -5
到这里我的理解是对的吗?
可是你的第二遍,我就没有弄明白了。
第二遍:
遇到5,bitflag[5]是1,数组不做改动,仍是5 -5 -5
然后遇到-5, 怎么办?设bitflag[5]=0?,数组变成 5 5 -5?
然后遇到-5,怎么办?
你什么时候判断5是出现了几次?
谢谢! |
|
t********e 发帖数: 344 | 17 我觉得明明有solution啊,就用quick sort的思想,大家看看对不对,还是我理解题目
有问题?
先扫一遍数组A[n],知道有多少负数,假设有m个
把m视为pivot的位置,设两个指针,一个初始指向A[0], 另一个初始指向A[m]:
i=0, j=m
if A[i]>0 and A[j]<0, swap them
if A[i]<0,i++
if A[j]>0,j++
直到i=m-1 或j = n-1
这样就好了是O(n) time, O(1)space
对挖? |
|
g***s 发帖数: 3811 | 18 任何一个字符串,只考虑它的第一个后最后一个字母。
设p(a,b) 为第一个字母是a,最后一个字母是b的字符串数目。
这样,扫描一遍就可以算出所有的p。p的空间是26×26.
后面怎么处理都不难了。 |
|
|
m*****k 发帖数: 731 | 20 离散数学书标准算法, :-)
先每位排序,从最小开始,从左到右,
设当前处理位 = 最后一位;
A:从当前处理位开始,向左扫描,找到数值比它小的一位i,交换,i 后边所有位排序
,从小到大,从左到右,重设当前处理位 = 最后一位;若找不到数值比它小的,当前
处理位左移一位, go to A; 如果无法左移,done。
example:
123,
当前处理位 = 最后一位, 指向3, 向左扫描,找到比它小的一位, 值是2,交换,得
132, 排序3后的所有位,
得132,
当前处理位重设为最后一位,
指向2,向左扫描,找到比它小的一位, 值是1,交换得231,排序2后的所有位,得213,
当前处理位重设为最后一位,
指向3,向左扫描,找到比它小的一位,值是1, 交换得231,排序3后的所有位,仍得231,
当前处理位重设为最后一位,
指向1, 向左扫描,无法找到比它小的一位,当前处理位 左移一位,指向3,
3,向左扫描,找到比它小的一位,值是2, 交换得321,排序3后的所有位,得312,
当前处理位重设为最后一位,
指向2,向左扫描,找到比它小的一位, 值是1,交换得321,排序2后的... 阅读全帖 |
|
|
d**********x 发帖数: 4083 | 22 一个简洁一点的办法
先用O(V^3)的算法找出all pair shortest paths
设起点为S,终点为T
然后从目标点递归回溯,回溯过程中取点v,使得S到v距离加上v到其下一点u的距离之
和为S到u的距离。大体上如下:
find_path(Vertex source, Vertex target)
static list path
path.push(target)
if source == target
output path
path.pop(source)
return
for Vertex v in t.neighbors
if dist(source, v) + dist(v, target) == dist(source, target)
find_path(source, v)
path.pop(target) |
|
g*****g 发帖数: 34805 | 23 不行用解释几何应该也很容易,设个坐标系算一下一个二维
式子的最小值。 |
|
p******9 发帖数: 47 | 24 不知道对不对
(1) 设A=kC+x, 那么A^B % C = (kC + x)^B % C= x^B % C = (x^(B/2) )^2 % C = (x
^(B /2)%C)^2 = ... O(logn)求得结果
(2) 维护一个堆,每次拿出最小的两个,再把生成的结果放回去,O(nlogn) |
|
b***r 发帖数: 4186 | 25 对啊,问我下面的code有什么错
final hashmap aMap=new hashmap();
aMap=new hashmap();
我说都final乐,不能再assign乐,
他说那会给什么错,
我想了老半天说,我不知道,我的IDE会报错,不会让我compile.
他说对。
晕阿,设套? |
|
b****e 发帖数: 45 | 26 将初始数列设为1..n,然后扫描signature, 碰到“I”就跳过,碰到连续的"D"就翻转
相应位置上的数字。代码如下:
vector FindSmallestPermutation(string signature) {
vector res(signature.size() + 1, 0);
for (int i = 0; i < res.size(); i++) {
res[i] = i + 1;
}
int pos = 0;
int start = 0;
while (pos < signature.size()) {
if (signature[pos] == 'D') {
start = pos;
while (pos < signature.size() && signature[pos] == 'D')
pos++;
reverse(res.begin() + st... 阅读全帖 |
|
f*****e 发帖数: 2992 | 27 有兴趣的话,可以把longway的那个条件语句里设个static variable++试试看。 |
|
d**s 发帖数: 98 | 28 非常规的解法:
http://blog.csdn.net/anchor89/article/details/6055412
经典面试题:设计包含min函数的栈,O(1)空间实现方法
分类: 数据结构和算法 2010-12-04 22:20 2102人阅读 评论(10) 收藏 举报
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数
min、push以及pop的时间复杂度都是O(1)。
注:这是06年一道Google的面试题.
先来说个常规解和他的一个优化,常规解的时间复杂度符合要求,但需要线性的额外空间.
常规解(参考 http://zhedahht.blog.163.com/blog/static/25411174200712895228171/):
除了题目要求的栈之外新开一个栈,用来记录最小值,每当在原栈中push数据后,与最小
值栈中的栈顶元素比较,如果新值较小,则在最小值栈中push新值;否则再次push栈顶元
素.
pop的时候,只要将最小值栈也pop一下就行了.
这样,min函数只需要返回最小值栈的栈顶元素即可.
常规解空间上的一个优化:
一般... 阅读全帖 |
|
s****t 发帖数: 467 | 29 似乎记得以前在版面上看过,不过找不到了。
题目大意是说给定两个人,需要知道他们是不是genetically related。Genetically
related的定义是指父母子女、兄弟姐妹这样的关系,夫妻关系不属于。问需要怎样设
计family tree/graph来支持这样的查找。
想了半天没想到好的解法,大家有什么想法吗? |
|
K*****k 发帖数: 430 | 30 我自己后来想了下,应该和二爷的思路大体一致,只不过二爷好像是从尾部倒着来,我
的是从头部顺着来。
二爷能否看看对不对。
假如char str[0 .. n - 1]是输入字符串
定义int dp[0 .. n - 1],全部初始化为0
dp[j]表示str[0 .. j]的最小的划分词数,先计算出dp[0]来
求dp[j + 1], 就是
1) 如果str[0 .. j + 1]在字典中,直接设dp[j + 1] = 1
2) 遍历1 <= k <= j + 1, 如果str[k .. j + 1]在字典中且dp[k - 1]大于0,把最小的
那个dp[k - 1]加上1放到dp[j + 1]中
最后的结果就是返回dp[n - 1], 如果值为0表示无法分词。 |
|
m***k 发帖数: 946 | 31 设f(N)为最多可以抛N次的情况下,最大值的期望。
那么显然f(N+1) =
1/6 * 6 (第一次抛点数为6, 不用继续抛了) +
1/6 * max{5, f(N)} (第一次抛点数为5) +
1/6 * max{4, f(N)} (第一次抛点数为4) +
1/6 * max{3, f(N)} (第一次抛点数为3) +
1/6 * max{2, f(N)} (第一次抛点数为2) +
1/6 * f(N) (第一次抛点数为1, 肯定接着抛
;
f(1) = 1/6 (1+2+...+6). |
|
m***k 发帖数: 946 | 32 设f(N)为最多可以抛N次的情况下,最大值的期望。
那么显然f(N+1) =
1/6 * 6 (第一次抛点数为6, 不用继续抛了) +
1/6 * max{5, f(N)} (第一次抛点数为5) +
1/6 * max{4, f(N)} (第一次抛点数为4) +
1/6 * max{3, f(N)} (第一次抛点数为3) +
1/6 * max{2, f(N)} (第一次抛点数为2) +
1/6 * f(N) (第一次抛点数为1, 肯定接着抛
;
f(1) = 1/6 (1+2+...+6). |
|
c********w 发帖数: 2438 | 33 来自主题: JobHunting版 - 请教一道题 另开一个大的数组b
把原来数组a里有的数做大数组的index
b[a[i]]都设为1
其余为0
然后统计?
可以么? |
|
h*******0 发帖数: 270 | 34 可以设linkedlist pointer指向null, loop结束后检查pointer是否指向了null。 如
果指向null了,返回\0。 不过我觉得面试官考的有点无厘头。。。 |
|
w****x 发帖数: 2483 | 35
多分几个数据库是不是可以,这个问题没那么容易啊。
实在不行只有设两个字段或两个数据库,如果出了问题只有互相对比判断到底收钱了没 |
|
l*********8 发帖数: 4642 | 36 设字符串S长度为N。
取K为N的质数因子,然后求解。 |
|
l*****a 发帖数: 14598 | 37 quick select O(n)
设一个pivot,分成两组,根据两组大小然后继续... |
|
y****n 发帖数: 743 | 38 1. 因为对称,计算1/8圆,就可以画整个圆。
2. 设d=x^2+y^2-r^2,当d>0,说明点在圆外
3. 最开始x=r,y=0
4. 下一个点,y++:
因为公式:(y+1)^2=y^2+2y+1,所以d+=2y+1。
如果d>0,则x--,同时d-=2x-1;
5. 重复第四步,直到1/8圆
public void DrawCircle(Bitmap bitmap, int centerX, int centerY, int r)
{
int x = r;
int y = 0;
int diff = 0;
while (x >= y)
{
DrawPixel(bitmap, centerX + x, centerY + y);
DrawPixel(bitmap, centerX - x, centerY + y);
DrawPixel(bitmap, centerX + x, centerY - y);
DrawPixel(bitmap, centerX - x, centerY - y);
DrawPixel(bitmap, centerX + y, centerY + x... 阅读全帖 |
|
f**********t 发帖数: 1001 | 39 我有一个M*N维的矩阵
希望找到一个m*n维的子矩阵使得其元素和最大
这个子矩阵的行和列不一定要连续
这个问题有好的解么?
就比如说,一个矩阵是3*3的
设每行每列的编号是(1, 1,) (1, 2), (1, 3)(2, 1,) (2, 2), (2, 3)(3, 1,) (3, 2)
, (3, 3),则(1, 1)(1, 3)(3, 1)(3, 3)这四个点组成的也算是个子矩阵
目前有想法,但时间复杂度很大。感觉好像只有枚举法来做这个问题。不知大家有没有
更好的解法。 |
|
w***y 发帖数: 6251 | 40 遇到挡板就停下来
我想最后跟迷宫解法是没区别的, 但是这个是设计提, 最主要的是用什么样的class/
structure去组织。 当时面试官花了很多时间问我,想要用什么去表示这个迷宫---
传统的就是一个array; 剩下的就是用到哪些method什么的,譬如移动一下到什么位
置怎么实现之类的 |
|
b******7 发帖数: 92 | 41 不能先分段shuffle,再shuffle段id,这样不均匀。比如考虑数组为aaaaabcdef,若按
照这个思路,则无论怎么shuffle,这5个a都会在一起。
我的考虑和racolas一样,先将N个元素shuffle到M个文件中,再在M个文件内shuffle,
最后合并。
定义每个文件当前可容纳元素个数r[i],i=0...M-1,初始时所有r[i]都为N/M
从磁盘上读取N个元素,设当前为第k个元素,则根据rand[1,N-k]落入{r[0],r[0]+r[1]
,r[0]+r[1]+r[2],...}中的哪一个决定第k个元素写入哪个文件,并且相应的文件可容
纳个数减1。 |
|
b******7 发帖数: 92 | 42 4)
设两人概率分别为p1,1-p1
则p1 = 1/6 + 5/6 * (1-p1) ==> p1 = 6/11, 1-p1 = 5/11
5)
判断顺子:将7张牌按数字排序,然后遍历找是否有连续的5个数字
判断同花:将7张牌按花色排序,然后找是否有连续的5个花色
判断同花顺:将同花中的最多连续的花色按数字排序,找连续5个数字
6)
构建trie,trie节点中加一个计数变量,统计多少个url包含该trie节点,然后按层遍
历+减枝找到最长的prefix
struct TrieNode{
char c;
vector childs;
int count;
}; |
|
b******7 发帖数: 92 | 43 设A、B两人概率为Pa,Pb
则A获胜有两种可能:
1.A第一次就kill了B,概率为1/6
2.A第一次没有kill掉B(5/6的概率),但接下来的轮到B先开始的回合里,B没有获胜(
1-Pa的概率),总概率为5/6*(1-Pa)
Pa = 1/6 + 5/6 * (1- Pa) |
|
r**a 发帖数: 31 | 44 你的方法实现起来简单,当m和n有一个很小时非常实用
更通用的做法是解一个线性方程组(mod 2意义下的),一共有m*n个方程和m*n个未知数
,每个未知数表示这个灯泡是否需要变化,每个方程表示一个灯泡的情况。举例来说,
设2*2的灯泡的情况是
V00 V01
V10 V11
这里Vij取值为0或1,表示灯泡一开始亮或灭。有方程组
X00 + X01 + X10 = V00
X00 + X01 + X11 = V01
X00 + X10 + X11 = V10
X01 + X10 + X11 = V11
在mod 2意义下解这个方程组就可以了。用直接的高斯消元法,复杂度是O((m*n)^3)。
因为这里方程组的系数非常有规律,实际上好像有更快的做法。 |
|
j******i 发帖数: 244 | 45 设从(0, 0)到(i, j)的最小和为P(i, j)
P(i, j) = min(P(i - 1, j), P(i - 1, j - 1)) + triangle[i][j] (除了边界上的
点)
这样知道上一行的P值,就可以推出下一行的P值,找出最后一行P值的最小值返回即可。
时间O(n^2),空间O(n)
class Solution {
public:
int minimumTotal(vector > &triangle) {
int n = triangle.size();
int * p = new int[n]();
int * q = new int[n]();
for (int i = 0; i < n; ++i) {
p[0] = q[0] + triangle[i][0];
for (int j = 1; j < i + 1; ++j) {
if (j == i)
... 阅读全帖 |
|
a******e 发帖数: 710 | 46 我想到一个小改进,利用三角不等式,即三角形两边之差<=第三条边的长度
两个字符串看成两个向量: B 和 C, C是A的子串。
现在要找距离B最小的C。
我们设三角形的第三点为原点O, 这样d(B,O)的距离就固定了,d(C,O)的距离可以在O(
1)时间内得到,因为d(C,O)就是各个字符的平方和。
根据三角不等式,我们有
d(B,C)>= abs( d(B,O) - d(C,O) )
其中右半部分部分可以在O(1)时间内得到。 如果算出来的这个d(B,C)的下限比目前的
最小距离还大, 那么这个C显然不可能是最近的子串,就不用再去计算d(B,C)了。
此思路与rolling hash有相似之处,只不过效率稍逊rolling hash,因为好的hash
function可以大幅减少collision
如A |
|
f********4 发帖数: 988 | 47 如果你同意sum >= 0是有解的,而且题目说了是唯一解。那么你找到的那个index,从
这个index出发,一直到array的尾部,每一项subSum都是大于0的,这个你肯定同意,
如果不是的话,就不会返回这个index。那么接下来就到了这个index的前半部分,你怎
么证明前半部分每一项subSum 都是大于0的,因为如果每一项大于0,那index就是解。
假设前面加到某一项的时候,设为index1,subSum小于0了,那根据sum大于等于0,也
就是说从这之后的subSum加起来是大于0的(因为从index到array的尾部一直到index1相
加的subsum是小于0的,满足sum大于0,index1到index之间的subsum一定大于0)。那么
这样index1就会成为index那个返回的点,因为index1不是index,所以没有这样的点。 |
|
e******g 发帖数: 51 | 48 上周电面遇到的,
给定一个Robot,这个robot有个lazy的探测器,可以探测自己和某个人(设为A)的距离。
现在A的状况未知,可能静止,也可能无规律地行走或奔跑,
问怎样设计策略(或算法)能尽快追上A。(假定robot和A在一个平面上)
求问各位大神有什么好的方法?
能不能让robot匀速运动然后计算相对加速度曲线? |
|
A*********c 发帖数: 430 | 49 来自主题: JobHunting版 - 上一道小题 想了一下,好像比想象的复杂,case比较多,关键是进位比较麻烦。
还写不出代码,胡说一下讨论讨论。
从任意数字生成palindrome比较复杂,
先假定输入已经是palindrome,生成下一个palindrome,因为这个可以解决第二个以后
的数字
给定任意一个palindome,设两个index,都放在中间。
如果是奇数位aaaxbbb, i,j 都指x
如果是偶数位aaxxbb,则i指第一个x,j指第二个。
最接近的下一个数字就是就是把x+1。如果x是9,就把x置零,对i-1,j+1加1
如果生成的最终数字多了一位如9999->10000, 就把个位数再加1.
现在就是怎么生成第一个palindrome,这个可以考虑用暴力,那就比较简单了。
如果不暴,是不是也可以用相似的双指针想法。但是好像情况比较复杂。
abcd efgh,还是俩index i j,从两边往中间扫。s[j] < s[i], 就把
s[j]变s[i],如果s[j] > s[i] ,还是s[j]变s[i],但是要把s[j-1], s[i+1]加一。
思路好像不是很elegent. 先走,有空再想想。 |
|
t****d 发帖数: 89 | 50 一个double类型的array名为list,长度为n,设两个点i和j,0
i],list[i+1]到list[j],list[j+1]到list[n]分别算一个score。需要找到i,j两个点,
使得三段的score之和最小。请问有什么好的算法,使得time complexity最小? |
|