数组中重复的数字-替换法(O(n),O(1))

数组中重复的数字

http://www.nowcoder.com/questionTerminal/6fe361ede7e54db1b84adc81d09d8524

//解题思路
/*替换法(O(n),O(1))
数组存放原则:numbers[i] = i
遍历数组所有元素,交换不符合数组存放原则的元素:
    例如[2,3,1,0,2]
    遍历0位元素2:(交换0位元素2和2位元素1)->[1,3,2,0,2]
    遍历0位元素1:(交换0位元素1和1位元素3)->[3,1,2,0,2]
    遍历0位元素3:(交换0位元素3和3位元素0)->[0,1,2,3,2]
    依次遍历0、1、2、3位置元素,都符合存放原则numbers[i] = i,不做任何操作
    遍历末位元素2,此时末位元素2和2位元素2相等,出现了两次,即数字2位重复元素
 */
public int duplicate (int[] numbers) {
    for (int i = 0; i < numbers.length; i++) {
        if (numbers[i] != i){
            if (numbers[i] == numbers[numbers[i]]) return numbers[i];
            int temp = numbers[numbers[i]];
            numbers[numbers[i]] = numbers[i];
            numbers[i] = temp;
            i--;//遍历完0位元素以及交换完数字后,如果0位元素仍不符合数组存放原则:numbers[i] = i,那么还要重新遍历0位元素
        }
    }
    return -1;
}
全部评论
方法不错但是使用条件严格,必须是n-1数组。 i--这操作导致时间复杂度应该比O(n)大 例:2,3,4,5,6,7,8,9,1,1 这样每个元素都起码执行了n-1次,n-2,n-3 复杂度最坏应该是n^2
1 回复 分享
发布于 2021-04-21 10:25
!n? n的排列组合
点赞 回复 分享
发布于 2021-04-21 10:31
一个while循环不就完了吗,还if里面i--,一开始都没看明白
点赞 回复 分享
发布于 2021-06-08 21:10
不合法输入 需要写出来吗?
点赞 回复 分享
发布于 2021-06-24 18:22
请问:i--;//遍历完0位元素以及交换完数字后,如果0位元素仍不符合数组存放原则:numbers[i] = i,那么还要重新遍历0位元素.这句话是什么意思呢?为什么需要i--???力扣上的同一道题为啥又不需要i--??咋看着两道题一模一样,力扣题目https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
点赞 回复 分享
发布于 2021-07-29 15:54
i--不会报错嘛,i开始为0,--就变负了,我这样写是运行不出了的,编译器还卡死了
点赞 回复 分享
发布于 2021-08-04 10:15
...什么鬼,写完这个代码运行,没有结果就算了,电脑都快死机了,我明明推算逻辑也没问题呀。。。
点赞 回复 分享
发布于 2021-08-04 10:26
回一楼,用这个方法,每一次交换都必有一个数i回到数组对应位置array[i],所以这个方法在最坏最坏的情况下,就是你举的那个例子也只需要运行array.length次,也就是说时间复杂度就是O(n)
点赞 回复 分享
发布于 2021-09-22 10:23

相关推荐

昨天 10:35
已编辑
西安科技大学 后端
点赞 评论 收藏
分享
01-15 13:52
已编辑
河南大学 Java
六年要多久:标准头像,不吃香菜😂
点赞 评论 收藏
分享
评论
20
1
分享

创作者周榜

更多
牛客网
牛客企业服务