927:三等分
This commit is contained in:
parent
a8e982ffed
commit
8035ce9d82
104
src/main/java/leetcode/editor/cn/ThreeEqualParts.java
Normal file
104
src/main/java/leetcode/editor/cn/ThreeEqualParts.java
Normal file
@ -0,0 +1,104 @@
|
||||
//给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个非空的部分 ,使得所有这些部分表示相同的二进制值。
|
||||
//
|
||||
// 如果可以做到,请返回任何 [i, j],其中 i+1 < j,这样一来:
|
||||
//
|
||||
//
|
||||
// arr[0], arr[1], ..., arr[i] 为第一部分;
|
||||
// arr[i + 1], arr[i + 2], ..., arr[j - 1] 为第二部分;
|
||||
// arr[j], arr[j + 1], ..., arr[arr.length - 1] 为第三部分。
|
||||
// 这三个部分所表示的二进制值相等。
|
||||
//
|
||||
//
|
||||
// 如果无法做到,就返回 [-1, -1]。
|
||||
//
|
||||
// 注意,在考虑每个部分所表示的二进制时,应当将其看作一个整体。例如,[1,1,0] 表示十进制中的 6,而不会是 3。此外,前导零也是被允许的,所以 [0,
|
||||
//1,1] 和 [1,1] 表示相同的值。
|
||||
//
|
||||
//
|
||||
//
|
||||
// 示例 1:
|
||||
//
|
||||
//
|
||||
//输入:arr = [1,0,1,0,1]
|
||||
//输出:[0,3]
|
||||
//
|
||||
//
|
||||
// 示例 2:
|
||||
//
|
||||
//
|
||||
//输入:arr = [1,1,0,1,1]
|
||||
//输出:[-1,-1]
|
||||
//
|
||||
// 示例 3:
|
||||
//
|
||||
//
|
||||
//输入:arr = [1,1,0,0,1]
|
||||
//输出:[0,2]
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
// 提示:
|
||||
//
|
||||
//
|
||||
//
|
||||
// 3 <= arr.length <= 3 * 10⁴
|
||||
// arr[i] 是 0 或 1
|
||||
//
|
||||
// Related Topics 数组 数学 👍 61 👎 0
|
||||
|
||||
package leetcode.editor.cn;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
//927:三等分
|
||||
public class ThreeEqualParts {
|
||||
public static void main(String[] args) {
|
||||
Solution solution = new ThreeEqualParts().new Solution();
|
||||
// TO TEST
|
||||
solution.threeEqualParts(new int[]{1, 0, 1, 0, 1});
|
||||
}
|
||||
|
||||
//leetcode submit region begin(Prohibit modification and deletion)
|
||||
class Solution {
|
||||
public int[] threeEqualParts(int[] arr) {
|
||||
List<Integer> count1 = new ArrayList<>();
|
||||
StringBuilder str = new StringBuilder();
|
||||
for (int i = 0; i < arr.length; i++) {
|
||||
str.append(arr[i]);
|
||||
if (arr[i] == 1) {
|
||||
count1.add(i);
|
||||
}
|
||||
}
|
||||
if (count1.size() == 0) {
|
||||
return new int[]{0, 2};
|
||||
}
|
||||
if (count1.size() % 3 > 0) {
|
||||
return new int[]{-1, -1};
|
||||
}
|
||||
int ori = count1.size() - count1.size() / 3;
|
||||
int right = count1.get(ori);
|
||||
|
||||
String comStr = str.substring(right);
|
||||
str = new StringBuilder(str.substring(0, right));
|
||||
|
||||
int left = str.lastIndexOf(comStr);
|
||||
if (left < 0 || left + comStr.length() - 1 < count1.get(ori - 1)) {
|
||||
return new int[]{-1, -1};
|
||||
}
|
||||
right = left + comStr.length();
|
||||
str = new StringBuilder(str.substring(0, left));
|
||||
|
||||
int index = str.lastIndexOf(comStr);
|
||||
if (index < 0) {
|
||||
return new int[]{-1, -1};
|
||||
}
|
||||
left = index + comStr.length() - 1;
|
||||
|
||||
return new int[]{left, right};
|
||||
}
|
||||
}
|
||||
//leetcode submit region end(Prohibit modification and deletion)
|
||||
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
<p>给定一个由 <code>0</code> 和 <code>1</code> 组成的数组<meta charset="UTF-8" /> <code>arr</code> ,将数组分成 <strong>3 个非空的部分</strong> ,使得所有这些部分表示相同的二进制值。</p>
|
||||
|
||||
<p>如果可以做到,请返回<strong>任何</strong> <code>[i, j]</code>,其中 <code>i+1 < j</code>,这样一来:</p>
|
||||
|
||||
<ul>
|
||||
<li><code>arr[0], arr[1], ..., arr[i]</code> 为第一部分;</li>
|
||||
<li><code>arr[i + 1], arr[i + 2], ..., arr[j - 1]</code> 为第二部分;</li>
|
||||
<li><code>arr[j], arr[j + 1], ..., arr[arr.length - 1]</code> 为第三部分。</li>
|
||||
<li>这三个部分所表示的二进制值相等。</li>
|
||||
</ul>
|
||||
|
||||
<p>如果无法做到,就返回 <code>[-1, -1]</code>。</p>
|
||||
|
||||
<p>注意,在考虑每个部分所表示的二进制时,应当将其看作一个整体。例如,<code>[1,1,0]</code> 表示十进制中的 <code>6</code>,而不会是 <code>3</code>。此外,前导零也是<strong>被允许</strong>的,所以 <code>[0,1,1]</code> 和 <code>[1,1]</code> 表示相同的值。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>arr = [1,0,1,0,1]
|
||||
<strong>输出:</strong>[0,3]
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>arr = [1,1,0,1,1]
|
||||
<strong>输出:</strong>[-1,-1]</pre>
|
||||
|
||||
<p><strong>示例 3:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>arr = [1,1,0,0,1]
|
||||
<strong>输出:</strong>[0,2]
|
||||
</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
<meta charset="UTF-8" />
|
||||
|
||||
<ul>
|
||||
<li><code>3 <= arr.length <= 3 * 10<sup>4</sup></code></li>
|
||||
<li><code>arr[i]</code> 是 <code>0</code> 或 <code>1</code></li>
|
||||
</ul>
|
||||
<div><div>Related Topics</div><div><li>数组</li><li>数学</li></div></div><br><div><li>👍 61</li><li>👎 0</li></div>
|
Loading…
Reference in New Issue
Block a user