有一个给定的有序数组(类型long),数组中有很多重复项。任意给一个索引值,求向后走第一个不同值的索引值和向前走第一个不同值的最前一

stavck 2002-04-23 03:56:09
有一个给定的有序数组(类型long),数组中有很多重复项。如:
0 0 0 1 1 1 1 1 1 2 3 3 3 4 4 6 6 6 7 7 7 9 ……
任意给一个索引值,求向后走第一个不同值的索引值和向前走第一个不同值的最前一个的索引值。
例如:给定索引9,则向前走为3,向后走为10。
求O(1)的算法,辅助空间不要太大。
大家给点思路,若有好的想法,还可再加100分。
...全文
157 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mathe 2002-04-25
  • 打赏
  • 举报
回复
就是IT_worker的方法
如果你限O(n)的空间复杂度太大,那实在没有法子。比如你随便使用一下c++中各种模版函数,辅助的空间都至少是O(n),比如List,你至少要给每一个变量一个辅助空间保存next指针吧。
stavck 2002-04-25
  • 打赏
  • 举报
回复
还有没有其他的方法呢?
rty 2002-04-24
  • 打赏
  • 举报
回复
不明白什么意思?
stavck 2002-04-24
  • 打赏
  • 举报
回复
是题太难还是大家不理解我的意思哪?
stavck 2002-04-24
  • 打赏
  • 举报
回复
上面的算法可比O(n)大多了。有O(n)的算法吗?
mathe 2002-04-24
  • 打赏
  • 举报
回复
这道题目也没什么,O(n)的空间复杂度很正常,不能够算太大。
stuvwxyz 2002-04-24
  • 打赏
  • 举报
回复
设一表如下:
0 0 0 1 2 2 2 2 2 4 4 5 5 5 6 7 7 7 7 8 <-源数组
求表的每一项的前一个不同元素的首位置(以下简称前首)
和后一个不同元素的首位置(以下简称后首)分别是:

-1 -1 -1 0 3 3 3 3 3 4 4 9 9 9 11 14 14 14 14 15 <-前首
3 3 3 4 9 9 9 9 9 11 11 14 14 14 15 19 19 19 19 -1 <-后首
由此得出其规律是:

每一项的后首和向后第二个不同元素的前首相等。

把所有的前首存储在一个数组(以下称之为定位器)如:
 0 1 2 3 4 5 6 7 8 <-数组下标
_____________________________________
| -1| 0 | 3 | 4 | 9 | 11| 14| 15| 19| <-定位器
-------------------------------------
再用一个与源数组有相同项的数组(以下称之为索引数组)来存储每一项的前首在定位器中的位置,如:
 0  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <-数组下标
_________________________________________________________________________________
| 0 | 0 | 0 | 1 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 4 | 4 | 4 | 5 | 6 | 6 | 6 | 6 | 7 | <-索引数组
---------------------------------------------------------------------------------

这样在搜索时,只要取出索引数组中对应项的值,再以之为下标取出定位器中值就是所求项的前首,
求后首,定位器后移两位。如:求12的后首,则
后首= 定位器[(索引数组[12])+2];
stavck 2002-04-24
  • 打赏
  • 举报
回复
就是:
有一个给定的有序数组(类型long的),数组中有很多重复项。如:
0 0 0 1 1 1 1 1 1 2 3 3 3 4 4 6 6 6 7 7 7 9 ……
任意给一个数组的下标,求向后走第一个不同值的下标和向前走第一个不同值的最前一个的下标。
例如:给下标是9(其值是2),则向前走为下标应是3(其值是1,第一个不同于2的值的最前下标),向后走为10(其值是3,第一个不同于下标为9的值的下标)。
什么方法都行。
stavck 2002-04-23
  • 打赏
  • 举报
回复
有没有比这更简单的算法?辅助空间有点大。
stuvwxyz 2002-04-23
  • 打赏
  • 举报
回复
那样的话,辅助空间也太大了。
IT_worker 2002-04-23
  • 打赏
  • 举报
回复
你再建两个数组就得了例如
your data 0 0 0 1 1 1 1 1 1 2 3 3 3 4 4 6 6 6 7 7 7 9 ……
first next 3 3 3 9 9 9 9 9 9 a d d d f f k k k n n n ……
first prev 0 0 0 0 0 0 0 0 0 3 9 9 9 a a d d d f f f k ……

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧