天天看点

[Swift]LeetCode927. 三等分 | Three Equal Parts

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

➤微信公众号:山青咏芝(shanqingyongzhi)

➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)

➤GitHub地址:https://github.com/strengthen/LeetCode

➤原文地址:https://www.cnblogs.com/strengthen/p/9826329.html 

➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。

➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

Given an array 

A

 of 

s and 

1

s, divide the array into 3 non-empty parts such that all of these parts represent the same binary value.

If it is possible, return any 

[i, j]

 with 

i+1 < j

, such that:

  • A[0], A[1], ..., A[i]

     is the first part;
  • A[i+1], A[i+2], ..., A[j-1]

     is the second part, and
  • A[j], A[j+1], ..., A[A.length - 1]

     is the third part.
  • All three parts have equal binary value.

If it is not possible, return 

[-1, -1]

.

Note that the entire part is used when considering what binary value it represents.  For example, 

[1,1,0]

 represents 

6

 in decimal, not 

3

.  Also, leading zeros are allowed, so 

[0,1,1]

 and 

[1,1]

 represent the same value.

 Example 1:

Input: [1,0,1,0,1]
Output: [0,3]
      

Example 2:

Input: [1,1,0,1,1]
Output: [-1,-1]      

Note:

  1. 3 <= A.length <= 30000

  2. A[i] == 0

     or 

    A[i] == 1

 给定一个由 

 和 

1

 组成的数组 

A

,将数组分成 3 个非空的部分,使得所有这些部分表示相同的二进制值。

如果可以做到,请返回任何 

[i, j]

,其中 

i+1 < j

,这样一来:

  • A[0], A[1], ..., A[i]

     组成第一部分;
  • A[i+1], A[i+2], ..., A[j-1]

     作为第二部分;
  • A[j], A[j+1], ..., A[A.length - 1]

     是第三部分。
  • 这三个部分所表示的二进制值相等。

如果无法做到,就返回 

[-1, -1]

注意,在考虑每个部分所表示的二进制时,应当将其看作一个整体。例如,

[1,1,0]

 表示十进制中的 

6

,而不会是 

3

。此外,前导零也是被允许的,所以 

[0,1,1]

 和 

[1,1]

 表示相同的值。

 示例 1:

输入:[1,0,1,0,1]
输出:[0,3]
      

示例 2:

输出:[1,1,0,1,1]
输出:[-1,-1]      

 提示:

  1. 3 <= A.length <= 30000

  2. A[i] == 0

     或 

    A[i] == 1

388ms

1 class Solution {
 2   func threeEqualParts(_ A: [Int]) -> [Int] {
 3     var ones = [Int]()
 4     for var i in 0..<A.count {
 5       if A[i] == 1 {
 6         ones.append(i)
 7       }
 8     }    
 9     if ones.count%3 != 0 {
10       return [-1, -1]
11     }
12     
13     if ones.count == 0 {
14       return [0, A.count-1]
15     }
16 
17     let part = ones.count/3
18     
19     let trZero = A.count - ones.last! - 1
20     let i = ones[part-1] + trZero
21     let j = ones[part*2-1] + trZero
22     
23     if i >= ones[part] {
24       return [-1, -1]
25     }
26     if j >= ones[part*2] {
27       return [-1, -1]
28     }
29     
30     for var k in 0..<part {
31       let a = i - ones[k]
32       let b = j - ones[k+part]
33       let c = A.count - ones[k+part*2]-1
34       if a != b {
35         return [-1, -1]
36       }
37       if b != c {
38         return [-1, -1]
39       }
40     }
41     
42     return [i, j+1]
43   }
44 }      

424ms

1 class Solution {
 2     func threeEqualParts(_ A: [Int]) -> [Int] {
 3         let countA:Int = A.count
 4         var one:Int = 0
 5         for x in A {one += x}
 6         if one % 3 != 0 {return [-1,-1]}
 7         if one == 0 {return [0,countA - 1]}
 8         one /= 3
 9         var cc:Int = 0
10         var pos:[Int] = [Int](repeating: -2,count: 3)
11         var idx:Int = 0
12         for i in 0..<countA
13         {
14             if A[i] == 1 && cc % one == 0
15             {                
16                 pos[idx] = i
17                 idx += 1       
18             }
19             cc += A[i]
20         }
21         var len:Int = countA - pos[2]
22         if pos[1] < (pos[0] + len) || pos[2] < (pos[1] + len) {return [-1,-1]}
23         var i:Int = pos[0], j:Int = pos[1], k:Int = pos[2]
24         repeat
25         {
26             if (A[i] != A[j] || A[i] != A[k]) {return [-1,-1]};
27             i += 1
28             j += 1
29             k += 1
30         }while(k < countA)
31         return [pos[0] + len - 1, pos[1] + len]      
32     }
33 }      

428ms

1 class Solution {
 2     func threeEqualParts(_ A: [Int]) -> [Int] {
 3         let countA:Int = A.count
 4         var one:Int = 0
 5         for x in A {one += x}
 6         if one % 3 != 0 {return [-1,-1]}
 7         if one == 0 {return [0,countA - 1]}
 8         one /= 3
 9         var cc:Int = 0
10         var pos:[Int] = [Int](repeating: -2,count: 3)
11         var idx:Int = 0
12         for i in 0..<countA
13         {
14             if A[i] == 1 && cc % one == 0
15             {                
16                 pos[idx] = i
17                 idx += 1       
18             }
19             cc += A[i]
20         }
21         var len:Int = countA - pos[2]
22         if pos[1] < (pos[0] + len) || pos[2] < (pos[1] + len) {return [-1,-1]}
23         var i:Int = pos[0], j:Int = pos[1], k:Int = pos[2]
24         repeat
25         {
26             if (A[i] != A[j] || A[i] != A[k]) {return [-1,-1]};
27             i += 1
28             j += 1
29             k += 1
30         }while(k < countA)
31         return [pos[0] + len - 1, pos[1] + len]      
32     }
33 }      

转载于:https://www.cnblogs.com/strengthen/p/9826329.html