Compare commits
2 Commits
1ba2367740
...
f66bd3caed
Author | SHA1 | Date | |
---|---|---|---|
f66bd3caed | |||
467a2ee938 |
106
src/main/java/leetcode/editor/cn/MinimumGeneticMutation.java
Normal file
106
src/main/java/leetcode/editor/cn/MinimumGeneticMutation.java
Normal file
@ -0,0 +1,106 @@
|
||||
//<p>基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 <code>'A'</code>、<code>'C'</code>、<code>'G'</code> 和 <code>'T'</code> 之一。</p>
|
||||
//
|
||||
//<p>假设我们需要调查从基因序列 <code>start</code> 变为 <code>end</code> 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。</p>
|
||||
//
|
||||
//<ul>
|
||||
// <li>例如,<code>"AACCGGTT" --> "AACCGGTA"</code> 就是一次基因变化。</li>
|
||||
//</ul>
|
||||
//
|
||||
//<p>另有一个基因库 <code>bank</code> 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。(变化后的基因必须位于基因库 <code>bank</code> 中)</p>
|
||||
//
|
||||
//<p>给你两个基因序列 <code>start</code> 和 <code>end</code> ,以及一个基因库 <code>bank</code> ,请你找出并返回能够使 <code>start</code> 变化为 <code>end</code> 所需的最少变化次数。如果无法完成此基因变化,返回 <code>-1</code> 。</p>
|
||||
//
|
||||
//<p>注意:起始基因序列 <code>start</code> 默认是有效的,但是它并不一定会出现在基因库中。</p>
|
||||
//
|
||||
//<p> </p>
|
||||
//
|
||||
//<p><strong>示例 1:</strong></p>
|
||||
//
|
||||
//<pre>
|
||||
//<strong>输入:</strong>start = "AACCGGTT", end = "AACCGGTA", bank = ["AACCGGTA"]
|
||||
//<strong>输出:</strong>1
|
||||
//</pre>
|
||||
//
|
||||
//<p><strong>示例 2:</strong></p>
|
||||
//
|
||||
//<pre>
|
||||
//<strong>输入:</strong>start = "AACCGGTT", end = "AAACGGTA", bank = ["AACCGGTA","AACCGCTA","AAACGGTA"]
|
||||
//<strong>输出:</strong>2
|
||||
//</pre>
|
||||
//
|
||||
//<p><strong>示例 3:</strong></p>
|
||||
//
|
||||
//<pre>
|
||||
//<strong>输入:</strong>start = "AAAAACCC", end = "AACCCCCC", bank = ["AAAACCCC","AAACCCCC","AACCCCCC"]
|
||||
//<strong>输出:</strong>3
|
||||
//</pre>
|
||||
//
|
||||
//<p> </p>
|
||||
//
|
||||
//<p><strong>提示:</strong></p>
|
||||
//
|
||||
//<ul>
|
||||
// <li><code>start.length == 8</code></li>
|
||||
// <li><code>end.length == 8</code></li>
|
||||
// <li><code>0 <= bank.length <= 10</code></li>
|
||||
// <li><code>bank[i].length == 8</code></li>
|
||||
// <li><code>start</code>、<code>end</code> 和 <code>bank[i]</code> 仅由字符 <code>['A', 'C', 'G', 'T']</code> 组成</li>
|
||||
//</ul>
|
||||
//
|
||||
//<div><div>Related Topics</div><div><li>广度优先搜索</li><li>哈希表</li><li>字符串</li></div></div><br><div><li>👍 242</li><li>👎 0</li></div>
|
||||
package leetcode.editor.cn;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
// 433:最小基因变化
|
||||
public class MinimumGeneticMutation {
|
||||
public static void main(String[] args) {
|
||||
Solution solution = new MinimumGeneticMutation().new Solution();
|
||||
// TO TEST
|
||||
solution.minMutation("AACCGGTT","AAACGGTA",new String[]{"AACCGGTA","AACCGCTA","AAACGGTA"});
|
||||
}
|
||||
|
||||
//leetcode submit region begin(Prohibit modification and deletion)
|
||||
class Solution {
|
||||
public int minMutation(String startGene, String endGene, String[] bank) {
|
||||
List<String> vist = Arrays.stream(bank).collect(Collectors.toList());
|
||||
if (!vist.contains(endGene)) {
|
||||
return -1;
|
||||
}
|
||||
List<String> use = new ArrayList<>();
|
||||
Queue<String> queue = new LinkedList<>();
|
||||
queue.add(startGene);
|
||||
use.add(startGene);
|
||||
char[] chs = new char[]{'A', 'C', 'G', 'T'};
|
||||
int step = 1;
|
||||
while (!queue.isEmpty()) {
|
||||
int size = queue.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
String str = queue.poll();
|
||||
for (int j = 0; j < 8; j++) {
|
||||
for (int k = 0; k < 4; k++) {
|
||||
if (chs[k] == str.charAt(j)) {
|
||||
continue;
|
||||
}
|
||||
StringBuffer sb = new StringBuffer(str);
|
||||
sb.setCharAt(j,chs[k]);
|
||||
String tmp = sb.toString();
|
||||
if(tmp.equals(endGene)){
|
||||
return step;
|
||||
}
|
||||
if(vist.contains(tmp)&& !use.contains(tmp)){
|
||||
queue.add(tmp);
|
||||
use.add(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
step++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
//leetcode submit region end(Prohibit modification and deletion)
|
||||
|
||||
}
|
@ -0,0 +1,90 @@
|
||||
//<p>在一个长度 <strong>无限 </strong>的数轴上,第 <code>i</code> 颗石子的位置为 <code>stones[i]</code>。如果一颗石子的位置最小/最大,那么该石子被称作 <strong>端点石子 </strong>。</p>
|
||||
//
|
||||
//<p>每个回合,你可以将一颗端点石子拿起并移动到一个未占用的位置,使得该石子不再是一颗端点石子。</p>
|
||||
//
|
||||
//<p>值得注意的是,如果石子像 <code>stones = [1,2,5]</code> 这样,你将 <strong>无法 </strong>移动位于位置 5 的端点石子,因为无论将它移动到任何位置(例如 0 或 3),该石子都仍然会是端点石子。</p>
|
||||
//
|
||||
//<p>当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。</p>
|
||||
//
|
||||
//<p>要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:<code>answer = [minimum_moves, maximum_moves]</code> 。</p>
|
||||
//
|
||||
//<p> </p>
|
||||
//
|
||||
//<p><strong>示例 1:</strong></p>
|
||||
//
|
||||
//<pre>
|
||||
//<strong>输入:</strong>[7,4,9]
|
||||
//<strong>输出:</strong>[1,2]
|
||||
//<strong>解释:</strong>
|
||||
//我们可以移动一次,4 -> 8,游戏结束。
|
||||
//或者,我们可以移动两次 9 -> 5,4 -> 6,游戏结束。
|
||||
//</pre>
|
||||
//
|
||||
//<p><strong>示例 2:</strong></p>
|
||||
//
|
||||
//<pre>
|
||||
//<strong>输入:</strong>[6,5,4,3,10]
|
||||
//<strong>输出:</strong>[2,3]
|
||||
//<strong>解释:</strong>
|
||||
//我们可以移动 3 -> 8,接着是 10 -> 7,游戏结束。
|
||||
//或者,我们可以移动 3 -> 7, 4 -> 8, 5 -> 9,游戏结束。
|
||||
//注意,我们无法进行 10 -> 2 这样的移动来结束游戏,因为这是不合要求的移动。
|
||||
//</pre>
|
||||
//
|
||||
//<p><strong>示例 3:</strong></p>
|
||||
//
|
||||
//<pre>
|
||||
//<strong>输入:</strong>[100,101,104,102,103]
|
||||
//<strong>输出:</strong>[0,0]</pre>
|
||||
//
|
||||
//<p> </p>
|
||||
//
|
||||
//<p><strong>提示:</strong></p>
|
||||
//
|
||||
//<ul>
|
||||
// <li><code>3 <= stones.length <= 10^4</code></li>
|
||||
// <li><code>1 <= stones[i] <= 10^9</code></li>
|
||||
// <li><code>stones[i]</code> 的值各不相同。</li>
|
||||
//</ul>
|
||||
//
|
||||
//<p> </p>
|
||||
//
|
||||
//<div><div>Related Topics</div><div><li>数组</li><li>数学</li><li>双指针</li><li>排序</li></div></div><br><div><li>👍 165</li><li>👎 0</li></div>
|
||||
package leetcode.editor.cn;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
// 1040:移动石子直到连续 II
|
||||
public class MovingStonesUntilConsecutiveIi {
|
||||
public static void main(String[] args) {
|
||||
Solution solution = new MovingStonesUntilConsecutiveIi().new Solution();
|
||||
// TO TEST
|
||||
}
|
||||
|
||||
//leetcode submit region begin(Prohibit modification and deletion)
|
||||
class Solution {
|
||||
public int[] numMovesStonesII(int[] stones) {
|
||||
int size = stones.length;
|
||||
Arrays.sort(stones);
|
||||
if (stones[size - 1] - stones[0] + 1 == size) {
|
||||
return new int[]{0, 0};
|
||||
}
|
||||
int max = Math.max(stones[size - 2] - stones[0] + 1, stones[size - 1] - stones[1] + 1) - (size - 1);
|
||||
int min = size;
|
||||
for (int i = 0; i < size; ++i) {
|
||||
int j = 0;
|
||||
while (j + 1 < size && stones[j + 1] - stones[i] + 1 <= size) {
|
||||
j++;
|
||||
}
|
||||
if (j - i + 1 == size - 1 && stones[j] - stones[i] + 1 == size - 1) {
|
||||
min = Math.min(min, 2);
|
||||
} else {
|
||||
min = Math.min(min, size - (j - i + 1));
|
||||
}
|
||||
}
|
||||
return new int[]{min, max};
|
||||
}
|
||||
}
|
||||
//leetcode submit region end(Prohibit modification and deletion)
|
||||
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
<p>基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 <code>'A'</code>、<code>'C'</code>、<code>'G'</code> 和 <code>'T'</code> 之一。</p>
|
||||
|
||||
<p>假设我们需要调查从基因序列 <code>start</code> 变为 <code>end</code> 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。</p>
|
||||
|
||||
<ul>
|
||||
<li>例如,<code>"AACCGGTT" --> "AACCGGTA"</code> 就是一次基因变化。</li>
|
||||
</ul>
|
||||
|
||||
<p>另有一个基因库 <code>bank</code> 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。(变化后的基因必须位于基因库 <code>bank</code> 中)</p>
|
||||
|
||||
<p>给你两个基因序列 <code>start</code> 和 <code>end</code> ,以及一个基因库 <code>bank</code> ,请你找出并返回能够使 <code>start</code> 变化为 <code>end</code> 所需的最少变化次数。如果无法完成此基因变化,返回 <code>-1</code> 。</p>
|
||||
|
||||
<p>注意:起始基因序列 <code>start</code> 默认是有效的,但是它并不一定会出现在基因库中。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>start = "AACCGGTT", end = "AACCGGTA", bank = ["AACCGGTA"]
|
||||
<strong>输出:</strong>1
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>start = "AACCGGTT", end = "AAACGGTA", bank = ["AACCGGTA","AACCGCTA","AAACGGTA"]
|
||||
<strong>输出:</strong>2
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 3:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>start = "AAAAACCC", end = "AACCCCCC", bank = ["AAAACCCC","AAACCCCC","AACCCCCC"]
|
||||
<strong>输出:</strong>3
|
||||
</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>start.length == 8</code></li>
|
||||
<li><code>end.length == 8</code></li>
|
||||
<li><code>0 <= bank.length <= 10</code></li>
|
||||
<li><code>bank[i].length == 8</code></li>
|
||||
<li><code>start</code>、<code>end</code> 和 <code>bank[i]</code> 仅由字符 <code>['A', 'C', 'G', 'T']</code> 组成</li>
|
||||
</ul>
|
||||
|
||||
<div><div>Related Topics</div><div><li>广度优先搜索</li><li>哈希表</li><li>字符串</li></div></div><br><div><li>👍 242</li><li>👎 0</li></div>
|
@ -0,0 +1,52 @@
|
||||
<p>在一个长度 <strong>无限 </strong>的数轴上,第 <code>i</code> 颗石子的位置为 <code>stones[i]</code>。如果一颗石子的位置最小/最大,那么该石子被称作 <strong>端点石子 </strong>。</p>
|
||||
|
||||
<p>每个回合,你可以将一颗端点石子拿起并移动到一个未占用的位置,使得该石子不再是一颗端点石子。</p>
|
||||
|
||||
<p>值得注意的是,如果石子像 <code>stones = [1,2,5]</code> 这样,你将 <strong>无法 </strong>移动位于位置 5 的端点石子,因为无论将它移动到任何位置(例如 0 或 3),该石子都仍然会是端点石子。</p>
|
||||
|
||||
<p>当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。</p>
|
||||
|
||||
<p>要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:<code>answer = [minimum_moves, maximum_moves]</code> 。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>[7,4,9]
|
||||
<strong>输出:</strong>[1,2]
|
||||
<strong>解释:</strong>
|
||||
我们可以移动一次,4 -> 8,游戏结束。
|
||||
或者,我们可以移动两次 9 -> 5,4 -> 6,游戏结束。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>[6,5,4,3,10]
|
||||
<strong>输出:</strong>[2,3]
|
||||
<strong>解释:</strong>
|
||||
我们可以移动 3 -> 8,接着是 10 -> 7,游戏结束。
|
||||
或者,我们可以移动 3 -> 7, 4 -> 8, 5 -> 9,游戏结束。
|
||||
注意,我们无法进行 10 -> 2 这样的移动来结束游戏,因为这是不合要求的移动。
|
||||
</pre>
|
||||
|
||||
<p><strong>示例 3:</strong></p>
|
||||
|
||||
<pre>
|
||||
<strong>输入:</strong>[100,101,104,102,103]
|
||||
<strong>输出:</strong>[0,0]</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>3 <= stones.length <= 10^4</code></li>
|
||||
<li><code>1 <= stones[i] <= 10^9</code></li>
|
||||
<li><code>stones[i]</code> 的值各不相同。</li>
|
||||
</ul>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<div><div>Related Topics</div><div><li>数组</li><li>数学</li><li>双指针</li><li>排序</li></div></div><br><div><li>👍 165</li><li>👎 0</li></div>
|
Loading…
Reference in New Issue
Block a user