@@ -16,9 +16,10 @@ impl Solution {
16
16
/// Time complexity: O(n) - Linear time complexity.
17
17
/// Space complexity: O(1) - We use constant extra space.
18
18
///
19
- /// Runtime 16 ms Beats 21.90%
20
- /// Memory 4 MB Beats 20.95%
21
- pub fn find_duplicate ( nums : Vec < i32 > ) -> i32 {
19
+ /// Runtime 11 ms Beats 59%
20
+ /// Memory 4 MB Beats 24%
21
+ #[ allow( dead_code) ]
22
+ pub fn find_duplicate_cast ( nums : Vec < i32 > ) -> i32 {
22
23
let nums = nums. iter ( ) . map ( |x| * x as usize ) . collect :: < Vec < usize > > ( ) ;
23
24
let ( mut slow, mut fast) = ( nums[ 0 ] , nums[ nums[ 0 ] ] ) ;
24
25
while slow != fast {
@@ -33,13 +34,60 @@ impl Solution {
33
34
}
34
35
slow as i32
35
36
}
37
+
38
+ /// Same logic but do not modify the input vector to cast to usize.
39
+ ///
40
+ /// Time complexity: O(n) - Linear time complexity.
41
+ /// Space complexity: O(1) - We use constant extra space.
42
+ ///
43
+ /// Runtime 12 ms Beats 57%
44
+ /// Memory 3.10 MB Beats 83%
45
+ pub fn find_duplicate ( nums : Vec < i32 > ) -> i32 {
46
+ let ( mut slow, mut fast) = ( nums[ 0 ] , nums[ nums[ 0 ] as usize ] ) ;
47
+ while slow != fast {
48
+ slow = nums[ slow as usize ] ;
49
+ fast = nums[ nums[ fast as usize ] as usize ] ;
50
+ }
51
+ // Reuse one of the pointers, it can be either.
52
+ fast = 0 ;
53
+ while slow != fast {
54
+ slow = nums[ slow as usize ] ;
55
+ fast = nums[ fast as usize ] ;
56
+ }
57
+ fast as i32
58
+ }
36
59
}
37
60
38
61
// Tests.
39
62
fn main ( ) {
40
- let tests = [ ( vec ! [ 1 , 3 , 4 , 2 , 2 ] , 2 ) , ( vec ! [ 3 , 1 , 3 , 4 , 2 ] , 3 ) ] ;
41
- for t in tests {
42
- assert_eq ! ( Solution :: find_duplicate( t. 0 ) , t. 1 ) ;
63
+ let tests = [
64
+ ( vec ! [ 1 , 3 , 4 , 2 , 2 ] , 2 ) ,
65
+ ( vec ! [ 3 , 1 , 3 , 4 , 2 ] , 3 ) ,
66
+ ( vec ! [ 3 , 3 , 3 , 3 , 3 ] , 3 ) ,
67
+ ] ;
68
+ println ! ( "\n \x1b [92m» Running {} tests...\x1b [0m" , tests. len( ) ) ;
69
+ let mut success = 0 ;
70
+ for ( i, t) in tests. iter ( ) . enumerate ( ) {
71
+ let res = Solution :: find_duplicate ( t. 0 . clone ( ) ) ;
72
+ if res == t. 1 {
73
+ success += 1 ;
74
+ println ! ( "\x1b [92m✔\x1b [95m Test {} passed!\x1b [0m" , i) ;
75
+ } else {
76
+ println ! (
77
+ "\x1b [31mx\x1b [95m Test {} failed expected: {:?} but got {}!!\x1b [0m" ,
78
+ i, t. 1 , res
79
+ ) ;
80
+ }
81
+ }
82
+ println ! ( ) ;
83
+ if success == tests. len ( ) {
84
+ println ! ( "\x1b [30;42m✔ All tests passed!\x1b [0m" )
85
+ } else if success == 0 {
86
+ println ! ( "\x1b [31mx \x1b [41;37mAll tests failed!\x1b [0m" )
87
+ } else {
88
+ println ! (
89
+ "\x1b [31mx\x1b [95m {} tests failed!\x1b [0m" ,
90
+ tests. len( ) - success
91
+ )
43
92
}
44
- println ! ( "\x1b [92m» All tests passed!\x1b [0m" )
45
93
}
0 commit comments