感觉这道题可以用置换的思维,让num[i]存放值为i+1的数字。遍历数组,如果num[i] == i+1,令i++查看下一个num[i]。如果num[i] != i+1,则看num[num[i] - 1]是否等于num[i],如果不同则两者交换,让num[i]到正确的位置,同时判断新的num[i] 是否等于 i+1,重复过程;如果num[num[i] - 1]等于num[i],则说明num[i]出现了两次,令i++查看下一个num[i]。 这样一趟下来,出现一次的数都到了正确的位置(值为i+1的数字回到了num[i])。再次遍历,其余num[i]!=i+1的数字就是出现两次的数字。这个方法时间复杂度为O(n),空间复杂度为O(1)。
4 1

相关推荐

今天 11:46
Java
如图:也是让我遇到逆天公司了,实习生是按天给工资,不忙直接强制休假了
baskly:公司为北京超图软件股份有限公司武汉分公司,明年公司应该会招新实习生,刷到的小伙伴快跑
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务