diff --git a/src/class01_01/Code01_SelectionSort.java b/src/class01/Code01_SelectionSort.java similarity index 99% rename from src/class01_01/Code01_SelectionSort.java rename to src/class01/Code01_SelectionSort.java index a5e4393..c9b5738 100644 --- a/src/class01_01/Code01_SelectionSort.java +++ b/src/class01/Code01_SelectionSort.java @@ -1,4 +1,4 @@ -package class01_01; +package class01; import java.util.Arrays; diff --git a/src/class01_01/Code02_BubbleSort.java b/src/class01/Code02_BubbleSort.java similarity index 99% rename from src/class01_01/Code02_BubbleSort.java rename to src/class01/Code02_BubbleSort.java index 73fa617..14b6e47 100644 --- a/src/class01_01/Code02_BubbleSort.java +++ b/src/class01/Code02_BubbleSort.java @@ -1,4 +1,4 @@ -package class01_01; +package class01; import java.util.Arrays; diff --git a/src/class01_01/Code03_InsertionSort.java b/src/class01/Code03_InsertionSort.java similarity index 99% rename from src/class01_01/Code03_InsertionSort.java rename to src/class01/Code03_InsertionSort.java index 5e121b9..7283369 100644 --- a/src/class01_01/Code03_InsertionSort.java +++ b/src/class01/Code03_InsertionSort.java @@ -1,4 +1,4 @@ -package class01_01; +package class01; import java.util.Arrays; diff --git a/src/class01_01/Code04_BSExist.java b/src/class01/Code04_BSExist.java similarity index 98% rename from src/class01_01/Code04_BSExist.java rename to src/class01/Code04_BSExist.java index 0ea49cd..d89be00 100644 --- a/src/class01_01/Code04_BSExist.java +++ b/src/class01/Code04_BSExist.java @@ -1,4 +1,4 @@ -package class01_01; +package class01; import java.util.Arrays; diff --git a/src/class01_01/Code05_BSNearLeft.java b/src/class01/Code05_BSNearLeft.java similarity index 98% rename from src/class01_01/Code05_BSNearLeft.java rename to src/class01/Code05_BSNearLeft.java index a0ef0f0..eaf5804 100644 --- a/src/class01_01/Code05_BSNearLeft.java +++ b/src/class01/Code05_BSNearLeft.java @@ -1,4 +1,4 @@ -package class01_01; +package class01; import java.util.Arrays; diff --git a/src/class01_01/Code05_BSNearRight.java b/src/class01/Code05_BSNearRight.java similarity index 98% rename from src/class01_01/Code05_BSNearRight.java rename to src/class01/Code05_BSNearRight.java index 499eaac..f3b6f25 100644 --- a/src/class01_01/Code05_BSNearRight.java +++ b/src/class01/Code05_BSNearRight.java @@ -1,4 +1,4 @@ -package class01_01; +package class01; import java.util.Arrays; diff --git a/src/class01_01/Code06_BSAwesome.java b/src/class01/Code06_BSAwesome.java similarity index 96% rename from src/class01_01/Code06_BSAwesome.java rename to src/class01/Code06_BSAwesome.java index e3d1d73..bdca00d 100644 --- a/src/class01_01/Code06_BSAwesome.java +++ b/src/class01/Code06_BSAwesome.java @@ -1,4 +1,4 @@ -package class01_01; +package class01; public class Code06_BSAwesome { diff --git a/src/class01_02/Code01_Swap.java b/src/class02/Code01_Swap.java similarity index 97% rename from src/class01_02/Code01_Swap.java rename to src/class02/Code01_Swap.java index aa86cf1..c625614 100644 --- a/src/class01_02/Code01_Swap.java +++ b/src/class02/Code01_Swap.java @@ -1,4 +1,4 @@ -package class01_02; +package class02; public class Code01_Swap { diff --git a/src/class01_02/Code02_EvenTimesOddTimes.java b/src/class02/Code02_EvenTimesOddTimes.java similarity index 98% rename from src/class01_02/Code02_EvenTimesOddTimes.java rename to src/class02/Code02_EvenTimesOddTimes.java index ad40cc0..13ac877 100644 --- a/src/class01_02/Code02_EvenTimesOddTimes.java +++ b/src/class02/Code02_EvenTimesOddTimes.java @@ -1,4 +1,4 @@ -package class01_02; +package class02; public class Code02_EvenTimesOddTimes { diff --git a/src/class01_02/Code03_KM.java b/src/class02/Code03_KM.java similarity index 99% rename from src/class01_02/Code03_KM.java rename to src/class02/Code03_KM.java index 69d70c5..abd03b4 100644 --- a/src/class01_02/Code03_KM.java +++ b/src/class02/Code03_KM.java @@ -1,4 +1,4 @@ -package class01_02; +package class02; import java.util.HashMap; import java.util.HashSet; diff --git a/src/class02_03/Code01_ReverseList.java b/src/class03/Code01_ReverseList.java similarity index 99% rename from src/class02_03/Code01_ReverseList.java rename to src/class03/Code01_ReverseList.java index e055459..4b0318a 100644 --- a/src/class02_03/Code01_ReverseList.java +++ b/src/class03/Code01_ReverseList.java @@ -1,4 +1,4 @@ -package class02_03; +package class03; import java.util.ArrayList; import java.util.List; diff --git a/src/class02_03/Code02_DeleteGivenValue.java b/src/class03/Code02_DeleteGivenValue.java similarity index 96% rename from src/class02_03/Code02_DeleteGivenValue.java rename to src/class03/Code02_DeleteGivenValue.java index 921cc3a..647047a 100644 --- a/src/class02_03/Code02_DeleteGivenValue.java +++ b/src/class03/Code02_DeleteGivenValue.java @@ -1,4 +1,4 @@ -package class02_03; +package class03; public class Code02_DeleteGivenValue { diff --git a/src/class02_03/Code03_DoubleEndsQueueToStackAndQueue.java b/src/class03/Code03_DoubleEndsQueueToStackAndQueue.java similarity index 99% rename from src/class02_03/Code03_DoubleEndsQueueToStackAndQueue.java rename to src/class03/Code03_DoubleEndsQueueToStackAndQueue.java index 3ac6763..c533b47 100644 --- a/src/class02_03/Code03_DoubleEndsQueueToStackAndQueue.java +++ b/src/class03/Code03_DoubleEndsQueueToStackAndQueue.java @@ -1,4 +1,4 @@ -package class02_03; +package class03; import java.util.LinkedList; import java.util.Queue; diff --git a/src/class02_03/Code04_RingArray.java b/src/class03/Code04_RingArray.java similarity index 97% rename from src/class02_03/Code04_RingArray.java rename to src/class03/Code04_RingArray.java index a0716ef..cad73b4 100644 --- a/src/class02_03/Code04_RingArray.java +++ b/src/class03/Code04_RingArray.java @@ -1,4 +1,4 @@ -package class02_03; +package class03; public class Code04_RingArray { diff --git a/src/class02_03/Code05_GetMinStack.java b/src/class03/Code05_GetMinStack.java similarity index 99% rename from src/class02_03/Code05_GetMinStack.java rename to src/class03/Code05_GetMinStack.java index 26371f0..91b20ae 100644 --- a/src/class02_03/Code05_GetMinStack.java +++ b/src/class03/Code05_GetMinStack.java @@ -1,4 +1,4 @@ -package class02_03; +package class03; import java.util.Stack; diff --git a/src/class02_03/Code06_TwoStacksImplementQueue.java b/src/class03/Code06_TwoStacksImplementQueue.java similarity index 98% rename from src/class02_03/Code06_TwoStacksImplementQueue.java rename to src/class03/Code06_TwoStacksImplementQueue.java index 1a9dcd0..483d7a7 100644 --- a/src/class02_03/Code06_TwoStacksImplementQueue.java +++ b/src/class03/Code06_TwoStacksImplementQueue.java @@ -1,4 +1,4 @@ -package class02_03; +package class03; import java.util.Stack; diff --git a/src/class02_03/Code07_TwoQueueImplementStack.java b/src/class03/Code07_TwoQueueImplementStack.java similarity index 98% rename from src/class02_03/Code07_TwoQueueImplementStack.java rename to src/class03/Code07_TwoQueueImplementStack.java index 89bc5cb..a2a3c54 100644 --- a/src/class02_03/Code07_TwoQueueImplementStack.java +++ b/src/class03/Code07_TwoQueueImplementStack.java @@ -1,4 +1,4 @@ -package class02_03; +package class03; import java.util.LinkedList; import java.util.Queue; diff --git a/src/class02_03/Code08_GetMax.java b/src/class03/Code08_GetMax.java similarity index 96% rename from src/class02_03/Code08_GetMax.java rename to src/class03/Code08_GetMax.java index 6ccb006..81661d8 100644 --- a/src/class02_03/Code08_GetMax.java +++ b/src/class03/Code08_GetMax.java @@ -1,4 +1,4 @@ -package class02_03; +package class03; public class Code08_GetMax { diff --git a/src/class02_03/HashMapAndSortedMap.java b/src/class03/HashMapAndSortedMap.java similarity index 95% rename from src/class02_03/HashMapAndSortedMap.java rename to src/class03/HashMapAndSortedMap.java index 440e278..bd54a06 100644 --- a/src/class02_03/HashMapAndSortedMap.java +++ b/src/class03/HashMapAndSortedMap.java @@ -1,4 +1,4 @@ -package class02_03; +package class03; import java.util.HashMap; import java.util.HashSet; diff --git a/src/class03_04/Code01_MergeSort.java b/src/class04/Code01_MergeSort.java similarity index 99% rename from src/class03_04/Code01_MergeSort.java rename to src/class04/Code01_MergeSort.java index a9d0448..c0ddb6b 100644 --- a/src/class03_04/Code01_MergeSort.java +++ b/src/class04/Code01_MergeSort.java @@ -1,4 +1,4 @@ -package class03_04; +package class04; public class Code01_MergeSort { diff --git a/src/class03_04/Code02_SmallSum.java b/src/class04/Code02_SmallSum.java similarity index 99% rename from src/class03_04/Code02_SmallSum.java rename to src/class04/Code02_SmallSum.java index 0211b51..1167a64 100644 --- a/src/class03_04/Code02_SmallSum.java +++ b/src/class04/Code02_SmallSum.java @@ -1,4 +1,4 @@ -package class03_04; +package class04; public class Code02_SmallSum { diff --git a/src/class03_04/Code03_ReversePair.java b/src/class04/Code03_ReversePair.java similarity index 99% rename from src/class03_04/Code03_ReversePair.java rename to src/class04/Code03_ReversePair.java index 524b769..0e6e531 100644 --- a/src/class03_04/Code03_ReversePair.java +++ b/src/class04/Code03_ReversePair.java @@ -1,4 +1,4 @@ -package class03_04; +package class04; public class Code03_ReversePair { diff --git a/src/class03_04/Code04_BiggerThanRightTwice.java b/src/class04/Code04_BiggerThanRightTwice.java similarity index 99% rename from src/class03_04/Code04_BiggerThanRightTwice.java rename to src/class04/Code04_BiggerThanRightTwice.java index 6b04d66..61a6a26 100644 --- a/src/class03_04/Code04_BiggerThanRightTwice.java +++ b/src/class04/Code04_BiggerThanRightTwice.java @@ -1,4 +1,4 @@ -package class03_04; +package class04; public class Code04_BiggerThanRightTwice { diff --git a/src/class03_05/Code01_CountOfRangeSum.java b/src/class05/Code01_CountOfRangeSum.java similarity index 98% rename from src/class03_05/Code01_CountOfRangeSum.java rename to src/class05/Code01_CountOfRangeSum.java index 5e703bd..559a7d8 100644 --- a/src/class03_05/Code01_CountOfRangeSum.java +++ b/src/class05/Code01_CountOfRangeSum.java @@ -1,4 +1,4 @@ -package class03_05; +package class05; // 这道题直接在leetcode测评: // https://leetcode.com/problems/count-of-range-sum/ diff --git a/src/class03_05/Code02_PartitionAndQuickSort.java b/src/class05/Code02_PartitionAndQuickSort.java similarity index 99% rename from src/class03_05/Code02_PartitionAndQuickSort.java rename to src/class05/Code02_PartitionAndQuickSort.java index 2e5a1d0..e8a9d7a 100644 --- a/src/class03_05/Code02_PartitionAndQuickSort.java +++ b/src/class05/Code02_PartitionAndQuickSort.java @@ -1,4 +1,4 @@ -package class03_05; +package class05; public class Code02_PartitionAndQuickSort { diff --git a/src/class03_05/Code03_QuickSortRecursiveAndUnrecursive.java b/src/class05/Code03_QuickSortRecursiveAndUnrecursive.java similarity index 99% rename from src/class03_05/Code03_QuickSortRecursiveAndUnrecursive.java rename to src/class05/Code03_QuickSortRecursiveAndUnrecursive.java index da05cf5..41609aa 100644 --- a/src/class03_05/Code03_QuickSortRecursiveAndUnrecursive.java +++ b/src/class05/Code03_QuickSortRecursiveAndUnrecursive.java @@ -1,4 +1,4 @@ -package class03_05; +package class05; import java.util.Stack; diff --git a/src/class04_06/Code01_Comparator.java b/src/class06/Code01_Comparator.java similarity index 99% rename from src/class04_06/Code01_Comparator.java rename to src/class06/Code01_Comparator.java index e1539ef..af23b64 100644 --- a/src/class04_06/Code01_Comparator.java +++ b/src/class06/Code01_Comparator.java @@ -1,4 +1,4 @@ -package class04_06; +package class06; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/class04_06/Code02_Heap.java b/src/class06/Code02_Heap.java similarity index 99% rename from src/class04_06/Code02_Heap.java rename to src/class06/Code02_Heap.java index 270c5b6..e5dd85c 100644 --- a/src/class04_06/Code02_Heap.java +++ b/src/class06/Code02_Heap.java @@ -1,4 +1,4 @@ -package class04_06; +package class06; import java.util.Comparator; import java.util.PriorityQueue; diff --git a/src/class04_06/Code03_HeapSort.java b/src/class06/Code03_HeapSort.java similarity index 99% rename from src/class04_06/Code03_HeapSort.java rename to src/class06/Code03_HeapSort.java index 7a255bd..49e743a 100644 --- a/src/class04_06/Code03_HeapSort.java +++ b/src/class06/Code03_HeapSort.java @@ -1,4 +1,4 @@ -package class04_06; +package class06; import java.util.Arrays; import java.util.PriorityQueue; diff --git a/src/class04_06/Code04_SortArrayDistanceLessK.java b/src/class06/Code04_SortArrayDistanceLessK.java similarity index 99% rename from src/class04_06/Code04_SortArrayDistanceLessK.java rename to src/class06/Code04_SortArrayDistanceLessK.java index bf552f5..0d1b1ea 100644 --- a/src/class04_06/Code04_SortArrayDistanceLessK.java +++ b/src/class06/Code04_SortArrayDistanceLessK.java @@ -1,4 +1,4 @@ -package class04_06; +package class06; import java.util.Arrays; import java.util.PriorityQueue; diff --git a/src/class04_07/Code01_CoverMax.java b/src/class07/Code01_CoverMax.java similarity index 99% rename from src/class04_07/Code01_CoverMax.java rename to src/class07/Code01_CoverMax.java index ed264fb..51cfd03 100644 --- a/src/class04_07/Code01_CoverMax.java +++ b/src/class07/Code01_CoverMax.java @@ -1,4 +1,4 @@ -package class04_07; +package class07; import java.util.Arrays; import java.util.Comparator; diff --git a/src/class04_07/Code02_EveryStepShowBoss.java b/src/class07/Code02_EveryStepShowBoss.java similarity index 99% rename from src/class04_07/Code02_EveryStepShowBoss.java rename to src/class07/Code02_EveryStepShowBoss.java index 9ee460b..a4c123b 100644 --- a/src/class04_07/Code02_EveryStepShowBoss.java +++ b/src/class07/Code02_EveryStepShowBoss.java @@ -1,4 +1,4 @@ -package class04_07; +package class07; import java.util.ArrayList; import java.util.Comparator; diff --git a/src/class04_07/HeapGreater.java b/src/class07/HeapGreater.java similarity index 99% rename from src/class04_07/HeapGreater.java rename to src/class07/HeapGreater.java index 85032d7..eab68a4 100644 --- a/src/class04_07/HeapGreater.java +++ b/src/class07/HeapGreater.java @@ -1,4 +1,4 @@ -package class04_07; +package class07; import java.util.ArrayList; import java.util.Comparator; diff --git a/src/class04_07/Inner.java b/src/class07/Inner.java similarity index 80% rename from src/class04_07/Inner.java rename to src/class07/Inner.java index 595b69d..d3d5326 100644 --- a/src/class04_07/Inner.java +++ b/src/class07/Inner.java @@ -1,4 +1,4 @@ -package class04_07; +package class07; public class Inner { public T value; diff --git a/src/class05_08/Code01_TrieTree.java b/src/class08/Code01_TrieTree.java similarity index 99% rename from src/class05_08/Code01_TrieTree.java rename to src/class08/Code01_TrieTree.java index b65b641..f7f9cf1 100644 --- a/src/class05_08/Code01_TrieTree.java +++ b/src/class08/Code01_TrieTree.java @@ -1,4 +1,4 @@ -package class05_08; +package class08; import java.util.HashMap; diff --git a/src/class05_08/Code02_TrieTree.java b/src/class08/Code02_TrieTree.java similarity index 99% rename from src/class05_08/Code02_TrieTree.java rename to src/class08/Code02_TrieTree.java index 3de857c..44d35cf 100644 --- a/src/class05_08/Code02_TrieTree.java +++ b/src/class08/Code02_TrieTree.java @@ -1,4 +1,4 @@ -package class05_08; +package class08; import java.util.HashMap; diff --git a/src/class05_08/Code03_CountSort.java b/src/class08/Code03_CountSort.java similarity index 99% rename from src/class05_08/Code03_CountSort.java rename to src/class08/Code03_CountSort.java index 2a7efb9..d7864ec 100644 --- a/src/class05_08/Code03_CountSort.java +++ b/src/class08/Code03_CountSort.java @@ -1,4 +1,4 @@ -package class05_08; +package class08; import java.util.Arrays; diff --git a/src/class05_08/Code04_RadixSort.java b/src/class08/Code04_RadixSort.java similarity index 99% rename from src/class05_08/Code04_RadixSort.java rename to src/class08/Code04_RadixSort.java index 7a131ad..af35db3 100644 --- a/src/class05_08/Code04_RadixSort.java +++ b/src/class08/Code04_RadixSort.java @@ -1,4 +1,4 @@ -package class05_08; +package class08; import java.util.Arrays; diff --git a/src/class06_09/Code01_LinkedListMid.java b/src/class09/Code01_LinkedListMid.java similarity index 99% rename from src/class06_09/Code01_LinkedListMid.java rename to src/class09/Code01_LinkedListMid.java index c406ae5..3283443 100644 --- a/src/class06_09/Code01_LinkedListMid.java +++ b/src/class09/Code01_LinkedListMid.java @@ -1,4 +1,4 @@ -package class06_09; +package class09; import java.util.ArrayList; diff --git a/src/class06_09/Code02_IsPalindromeList.java b/src/class09/Code02_IsPalindromeList.java similarity index 99% rename from src/class06_09/Code02_IsPalindromeList.java rename to src/class09/Code02_IsPalindromeList.java index 75353bd..63d6eed 100644 --- a/src/class06_09/Code02_IsPalindromeList.java +++ b/src/class09/Code02_IsPalindromeList.java @@ -1,4 +1,4 @@ -package class06_09; +package class09; import java.util.Stack; diff --git a/src/class06_09/Code03_SmallerEqualBigger.java b/src/class09/Code03_SmallerEqualBigger.java similarity index 99% rename from src/class06_09/Code03_SmallerEqualBigger.java rename to src/class09/Code03_SmallerEqualBigger.java index 6ec2d96..33203e4 100644 --- a/src/class06_09/Code03_SmallerEqualBigger.java +++ b/src/class09/Code03_SmallerEqualBigger.java @@ -1,4 +1,4 @@ -package class06_09; +package class09; public class Code03_SmallerEqualBigger { diff --git a/src/class06_09/Code04_CopyListWithRandom.java b/src/class09/Code04_CopyListWithRandom.java similarity index 99% rename from src/class06_09/Code04_CopyListWithRandom.java rename to src/class09/Code04_CopyListWithRandom.java index 7ae03d7..27ec73b 100644 --- a/src/class06_09/Code04_CopyListWithRandom.java +++ b/src/class09/Code04_CopyListWithRandom.java @@ -1,4 +1,4 @@ -package class06_09; +package class09; import java.util.HashMap; diff --git a/src/class06_10/Code01_FindFirstIntersectNode.java b/src/class10/Code01_FindFirstIntersectNode.java similarity index 99% rename from src/class06_10/Code01_FindFirstIntersectNode.java rename to src/class10/Code01_FindFirstIntersectNode.java index 473b4f8..8cec65d 100644 --- a/src/class06_10/Code01_FindFirstIntersectNode.java +++ b/src/class10/Code01_FindFirstIntersectNode.java @@ -1,4 +1,4 @@ -package class06_10; +package class10; public class Code01_FindFirstIntersectNode { diff --git a/src/class07_10/Code01_RecursiveTraversalBT.java b/src/class10/Code02_RecursiveTraversalBT.java similarity index 94% rename from src/class07_10/Code01_RecursiveTraversalBT.java rename to src/class10/Code02_RecursiveTraversalBT.java index 5027b7f..c7f2b2c 100644 --- a/src/class07_10/Code01_RecursiveTraversalBT.java +++ b/src/class10/Code02_RecursiveTraversalBT.java @@ -1,6 +1,6 @@ -package class07_10; +package class10; -public class Code01_RecursiveTraversalBT { +public class Code02_RecursiveTraversalBT { public static class Node { public int value; diff --git a/src/class07_10/Code02_UnRecursiveTraversalBT.java b/src/class10/Code03_UnRecursiveTraversalBT.java similarity index 97% rename from src/class07_10/Code02_UnRecursiveTraversalBT.java rename to src/class10/Code03_UnRecursiveTraversalBT.java index 4b4e857..96ef25e 100644 --- a/src/class07_10/Code02_UnRecursiveTraversalBT.java +++ b/src/class10/Code03_UnRecursiveTraversalBT.java @@ -1,8 +1,8 @@ -package class07_10; +package class10; import java.util.Stack; -public class Code02_UnRecursiveTraversalBT { +public class Code03_UnRecursiveTraversalBT { public static class Node { public int value; diff --git a/src/class07_11/Code01_LevelTraversalBT.java b/src/class11/Code01_LevelTraversalBT.java similarity index 97% rename from src/class07_11/Code01_LevelTraversalBT.java rename to src/class11/Code01_LevelTraversalBT.java index 2a377c3..12e8ef0 100644 --- a/src/class07_11/Code01_LevelTraversalBT.java +++ b/src/class11/Code01_LevelTraversalBT.java @@ -1,4 +1,4 @@ -package class07_11; +package class11; import java.util.LinkedList; import java.util.Queue; diff --git a/src/class07_11/Code02_SerializeAndReconstructTree.java b/src/class11/Code02_SerializeAndReconstructTree.java similarity index 99% rename from src/class07_11/Code02_SerializeAndReconstructTree.java rename to src/class11/Code02_SerializeAndReconstructTree.java index 4289ce0..c390d02 100644 --- a/src/class07_11/Code02_SerializeAndReconstructTree.java +++ b/src/class11/Code02_SerializeAndReconstructTree.java @@ -1,4 +1,4 @@ -package class07_11; +package class11; import java.util.LinkedList; import java.util.Queue; diff --git a/src/class07_11/Code03_EncodeNaryTreeToBinaryTree.java b/src/class11/Code03_EncodeNaryTreeToBinaryTree.java similarity index 98% rename from src/class07_11/Code03_EncodeNaryTreeToBinaryTree.java rename to src/class11/Code03_EncodeNaryTreeToBinaryTree.java index 67aa777..aa9f2ab 100644 --- a/src/class07_11/Code03_EncodeNaryTreeToBinaryTree.java +++ b/src/class11/Code03_EncodeNaryTreeToBinaryTree.java @@ -1,4 +1,4 @@ -package class07_11; +package class11; import java.util.ArrayList; import java.util.List; diff --git a/src/class07_11/Code04_PrintBinaryTree.java b/src/class11/Code04_PrintBinaryTree.java similarity index 98% rename from src/class07_11/Code04_PrintBinaryTree.java rename to src/class11/Code04_PrintBinaryTree.java index 64aeb7e..75125f7 100644 --- a/src/class07_11/Code04_PrintBinaryTree.java +++ b/src/class11/Code04_PrintBinaryTree.java @@ -1,4 +1,4 @@ -package class07_11; +package class11; public class Code04_PrintBinaryTree { diff --git a/src/class07_11/Code05_TreeMaxWidth.java b/src/class11/Code05_TreeMaxWidth.java similarity index 99% rename from src/class07_11/Code05_TreeMaxWidth.java rename to src/class11/Code05_TreeMaxWidth.java index 0c6d613..787bd01 100644 --- a/src/class07_11/Code05_TreeMaxWidth.java +++ b/src/class11/Code05_TreeMaxWidth.java @@ -1,4 +1,4 @@ -package class07_11; +package class11; import java.util.HashMap; import java.util.LinkedList; diff --git a/src/class07_11/Code06_SuccessorNode.java b/src/class11/Code06_SuccessorNode.java similarity index 99% rename from src/class07_11/Code06_SuccessorNode.java rename to src/class11/Code06_SuccessorNode.java index 5133db6..b33d4b5 100644 --- a/src/class07_11/Code06_SuccessorNode.java +++ b/src/class11/Code06_SuccessorNode.java @@ -1,4 +1,4 @@ -package class07_11; +package class11; public class Code06_SuccessorNode { diff --git a/src/class07_11/Code07_PaperFolding.java b/src/class11/Code07_PaperFolding.java similarity index 97% rename from src/class07_11/Code07_PaperFolding.java rename to src/class11/Code07_PaperFolding.java index 0a2b72f..3f3b0db 100644 --- a/src/class07_11/Code07_PaperFolding.java +++ b/src/class11/Code07_PaperFolding.java @@ -1,4 +1,4 @@ -package class07_11; +package class11; public class Code07_PaperFolding { diff --git a/src/class11_17/Code03_PrintAllPermutations.java b/src/class11_17/Code03_PrintAllPermutations.java deleted file mode 100644 index 332acf4..0000000 --- a/src/class11_17/Code03_PrintAllPermutations.java +++ /dev/null @@ -1,88 +0,0 @@ -package class11_17; - -import java.util.ArrayList; -import java.util.List; - -public class Code03_PrintAllPermutations { - - public static ArrayList permutation(String str) { - ArrayList res = new ArrayList<>(); - if (str == null || str.length() == 0) { - return res; - } - char[] chs = str.toCharArray(); - process(chs, 0, res); - return res; - } - - // str[0..i-1]已经做好决定的 - // str[i...]都有机会来到i位置 - // i终止位置,str当前的样子,就是一种结果 -> ans - public static void process(char[] str, int i, ArrayList ans) { - if (i == str.length) { - ans.add(String.valueOf(str)); - } - // 如果i没有终止,i... 都可以来到i位置 - for (int j = i; j < str.length; j++) { // j i后面所有的字符都有机会 - swap(str, i, j); - process(str, i + 1, ans); - swap(str, i, j); - } - } - - - public static ArrayList permutationNoRepeat(String str) { - ArrayList res = new ArrayList<>(); - if (str == null || str.length() == 0) { - return res; - } - char[] chs = str.toCharArray(); - process2(chs, 0, res); - return res; - } - - // str[0..i-1]已经做好决定的 - // str[i...]都有机会来到i位置 - // i终止位置,str当前的样子,就是一种结果 -> ans - public static void process2(char[] str, int i, ArrayList res) { - if (i == str.length) { - res.add(String.valueOf(str)); - return; - } - boolean[] visit = new boolean[26]; // visit[0 1 .. 25] - for (int j = i; j < str.length; j++) { - // str[j] = 'a' -> 0 visit[0] -> 'a' - - // str[j] = 'z' -> 25 visit[25] -> 'z' - if (!visit[str[j] - 'a']) { - - visit[str[j] - 'a'] = true; - swap(str, i, j); - process2(str, i + 1, res); - swap(str, i, j); - - } - } - } - - public static void swap(char[] chs, int i, int j) { - char tmp = chs[i]; - chs[i] = chs[j]; - chs[j] = tmp; - } - - public static void main(String[] args) { - String s = "aac"; - List ans1 = permutation(s); - for (String str : ans1) { - System.out.println(str); - } - System.out.println("======="); - List ans2 = permutationNoRepeat(s); - for (String str : ans2) { - System.out.println(str); - } - - } - -} diff --git a/src/class11_17/Code07_Knapsack.java b/src/class11_17/Code07_Knapsack.java deleted file mode 100644 index fcfa7c7..0000000 --- a/src/class11_17/Code07_Knapsack.java +++ /dev/null @@ -1,79 +0,0 @@ -package class11_17; - -public class Code07_Knapsack { - - public static int getMaxValue(int[] w, int[] v, int bag) { - return process(w, v, 0, 0, bag); - } - - // 不变 : w[] v[] bag - // index... 最大价值 - // 0..index-1上做了货物的选择,使得你已经达到的重量是多少alreadyW - // 如果返回-1,认为没有方案 - // 如果不返回-1,认为返回的值是真实价值 - public static int process(int[] w, int[] v, int index, int alreadyW, int bag) { - if (alreadyW > bag) { - return -1; - } - // 重量没超 - if (index == w.length) { - return 0; - } - int p1 = process(w, v, index + 1, alreadyW, bag); - int p2next = process(w, v, index + 1, alreadyW + w[index], bag); - int p2 = -1; - if (p2next != -1) { - p2 = v[index] + p2next; - } - return Math.max(p1, p2); - - } - - public static int maxValue(int[] w, int[] v, int bag) { - return process(w, v, 0, bag); - } - - // 只剩下rest的空间了, - // index...货物自由选择,但是剩余空间不要小于0 - // 返回 index...货物能够获得的最大价值 - public static int process(int[] w, int[] v, int index, int rest) { - if (rest < 0) { // base case 1 - return -1; - } - // rest >=0 - if (index == w.length) { // base case 2 - return 0; - } - // 有货也有空间 - int p1 = process(w, v, index + 1, rest); - int p2 = -1; - int p2Next = process(w, v, index + 1, rest - w[index]); - if(p2Next!=-1) { - p2 = v[index] + p2Next; - } - return Math.max(p1, p2); - } - - public static int dpWay(int[] w, int[] v, int bag) { - int N = w.length; - int[][] dp = new int[N + 1][bag + 1]; - for (int index = N - 1; index >= 0; index--) { - for (int rest = 1; rest <= bag; rest++) { - dp[index][rest] = dp[index + 1][rest]; - if (rest >= w[index]) { - dp[index][rest] = Math.max(dp[index][rest], v[index] + dp[index + 1][rest - w[index]]); - } - } - } - return dp[0][bag]; - } - - public static void main(String[] args) { - int[] weights = { 3, 2, 4, 7 }; - int[] values = { 5, 6, 3, 19 }; - int bag = 11; - System.out.println(maxValue(weights, values, bag)); - System.out.println(dpWay(weights, values, bag)); - } - -} diff --git a/src/class11_17/Code08_CardsInLine.java b/src/class11_17/Code08_CardsInLine.java deleted file mode 100644 index ddcb9da..0000000 --- a/src/class11_17/Code08_CardsInLine.java +++ /dev/null @@ -1,82 +0,0 @@ -package class11_17; - -public class Code08_CardsInLine { - - public static int win1(int[] arr) { - if (arr == null || arr.length == 0) { - return 0; - } - return Math.max( - f(arr, 0, arr.length - 1), - s(arr, 0, arr.length - 1) - ); - } - - // L....R - // F S L+1..R - // L..R-1 - public static int f(int[] arr, int L, int R) { - if (L == R) { - return arr[L]; - } - - return Math.max( - arr[L] + s(arr, L + 1, R), - arr[R] + s(arr, L, R - 1) - ); - } - - // arr[L..R] - public static int s(int[] arr, int L, int R) { - if (L == R) { - return 0; - } - return Math.min( - f(arr, L + 1, R), // arr[i] - f(arr, L, R - 1) // arr[j] - ); - } - - public static int win2(int[] arr) { - if (arr == null || arr.length == 0) { - return 0; - } - int N = arr.length; - int[][] f = new int[N][N]; - int[][] s = new int[N][N]; - for(int i = 0; i < N;i++) { - f[i][i] = arr[i]; - } - // s[i][i] = 0; - for(int i = 1; i < N;i++) { - int L =0; - int R =i; - while(L < N && R < N) { - - f[L][R] = Math.max( - arr[L] + s[L + 1][ R], - arr[R] + s[L][R - 1] - ); - s[L][R] = Math.min( - f[L + 1][R], // arr[i] - f[L][R - 1] // arr[j] - ); - - L++; - R++; - - } - } - return Math.max(f[0][N-1], s[0][N-1]); - } - - public static void main(String[] args) { - int[] arr = { 4,7,9,5,19,29,80,4 }; - // A 4 9 - // B 7 5 - System.out.println(win1(arr)); - System.out.println(win2(arr)); - - } - -} diff --git a/src/class08_12/Code01_IsCBT.java b/src/class12/Code01_IsCBT.java similarity index 99% rename from src/class08_12/Code01_IsCBT.java rename to src/class12/Code01_IsCBT.java index 812b33d..e0b9cab 100644 --- a/src/class08_12/Code01_IsCBT.java +++ b/src/class12/Code01_IsCBT.java @@ -1,4 +1,4 @@ -package class08_12; +package class12; import java.util.LinkedList; diff --git a/src/class12/Code01_RobotWalk.java b/src/class12/Code01_RobotWalk.java deleted file mode 100644 index 2a9ff14..0000000 --- a/src/class12/Code01_RobotWalk.java +++ /dev/null @@ -1,191 +0,0 @@ -package class12; - -public class Code01_RobotWalk { - - public static int ways1(int N, int M, int K, int P) { - // 参数无效直接返回0 - if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) { - return 0; - } - // 总共N个位置,从M点出发,还剩K步,返回最终能达到P的方法数 - return walk(N, M, K, P); - } - - // N : 位置为1 ~ N,固定参数 - // cur : 当前在cur位置,可变参数 - // rest : 还剩res步没有走,可变参数 - // P : 最终目标位置是P,固定参数 - // 该函数的含义:只能在1~N这些位置上移动,当前在cur位置,走完rest步之后,停在P位置的方法数作为返回值返回 - public static int walk(int N, int cur, int rest, int P) { - // 如果没有剩余步数了,当前的cur位置就是最后的位置 - // 如果最后的位置停在P上,那么之前做的移动是有效的 - // 如果最后的位置没在P上,那么之前做的移动是无效的 - if (rest == 0) { - return cur == P ? 1 : 0; - } - // 如果还有rest步要走,而当前的cur位置在1位置上,那么当前这步只能从1走向2 - // 后续的过程就是,来到2位置上,还剩rest-1步要走 - if (cur == 1) { - return walk(N, 2, rest - 1, P); - } - // 如果还有rest步要走,而当前的cur位置在N位置上,那么当前这步只能从N走向N-1 - // 后续的过程就是,来到N-1位置上,还剩rest-1步要走 - if (cur == N) { - return walk(N, N - 1, rest - 1, P); - } - // 如果还有rest步要走,而当前的cur位置在中间位置上,那么当前这步可以走向左,也可以走向右 - // 走向左之后,后续的过程就是,来到cur-1位置上,还剩rest-1步要走 - // 走向右之后,后续的过程就是,来到cur+1位置上,还剩rest-1步要走 - // 走向左、走向右是截然不同的方法,所以总方法数要都算上 - return walk(N, cur + 1, rest - 1, P) + walk(N, cur - 1, rest - 1, P); - } - - - - - - - public static int waysCache(int N, int M, int K, int P) { - // 参数无效直接返回0 - if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) { - return 0; - } - - int[][] dp = new int[N+1][K+1]; - for(int row = 0; row <= N; row++) { - for(int col = 0; col <= K; col++) { - dp[row][col] = -1; - } - } - return walkCache(N, M, K, P,dp); - } - - // HashMap (19,100) "19_100" - // 我想把所有cur和rest的组合,返回的结果,加入到缓存里 - public static int walkCache(int N, int cur, int rest, int P, int[][] dp) { - if(dp[cur][rest] != -1) { - return dp[cur][rest]; - } - if (rest == 0) { - dp[cur][rest] = cur == P ? 1 : 0; - return dp[cur][rest]; - } - if (cur == 1) { - dp[cur][rest] = walkCache(N, 2, rest - 1, P, dp); - return dp[cur][rest]; - } - if (cur == N) { - dp[cur][rest] =walkCache(N, N - 1, rest - 1, P,dp); - return dp[cur][rest]; - } - dp[cur][rest] = walkCache(N, cur + 1, rest - 1, P,dp) - + walkCache(N, cur - 1, rest - 1, P, dp); - return dp[cur][rest]; - } - - - - - - - - - - - public static int ways2(int N, int M, int K, int P) { - // 参数无效直接返回0 - if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) { - return 0; - } - int[][] dp = new int[K + 1][N + 1]; - dp[0][P] = 1; - for (int i = 1; i <= K; i++) { - for (int j = 1; j <= N; j++) { - if (j == 1) { - dp[i][j] = dp[i - 1][2]; - } else if (j == N) { - dp[i][j] = dp[i - 1][N - 1]; - } else { - dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]; - } - } - } - return dp[K][M]; - } - - public static int ways3(int N, int M, int K, int P) { - // 参数无效直接返回0 - if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) { - return 0; - } - int[] dp = new int[N + 1]; - dp[P] = 1; - for (int i = 1; i <= K; i++) { - int leftUp = dp[1];// 左上角的值 - for (int j = 1; j <= N; j++) { - int tmp = dp[j]; - if (j == 1) { - dp[j] = dp[j + 1]; - } else if (j == N) { - dp[j] = leftUp; - } else { - dp[j] = leftUp + dp[j + 1]; - } - leftUp = tmp; - } - } - return dp[M]; - } - - // ways4是你的方法 - public static int ways4(int N, int M, int K, int P) { - if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) { - return 0; - } - return process(N, 0, P, M, K); - } - - // 一共N个位置,从M点出发,一共只有K步。返回走到位置j,剩余步数为i的方法数 - public static int process(int N, int i, int j, int M, int K) { - if (i == K) { - return j == M ? 1 : 0; - } - if (j == 1) { - return process(N, i + 1, j + 1, M, K); - } - if (j == N) { - return process(N, i + 1, j - 1, M, K); - } - return process(N, i + 1, j + 1, M, K) + process(N, i + 1, j - 1, M, K); - } - - // ways5是你的方法的dp优化 - public static int ways5(int N, int M, int K, int P) { - if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) { - return 0; - } - int[][] dp = new int[K + 1][N + 1]; - dp[K][M] = 1; - for (int i = K - 1; i >= 0; i--) { - for (int j = 1; j <= N; j++) { - if (j == 1) { - dp[i][j] = dp[i + 1][j + 1]; - } else if (j == N) { - dp[i][j] = dp[i + 1][j - 1]; - } else { - dp[i][j] = dp[i + 1][j + 1] + dp[i + 1][j - 1]; - } - } - } - return dp[0][P]; - } - - public static void main(String[] args) { - System.out.println(ways1(7, 4, 9, 5)); - System.out.println(ways2(7, 4, 9, 5)); - System.out.println(ways3(7, 4, 9, 5)); - System.out.println(ways4(7, 4, 9, 5)); - System.out.println(ways5(7, 4, 9, 5)); - } - -} diff --git a/src/class08_12/Code02_IsBST.java b/src/class12/Code02_IsBST.java similarity index 99% rename from src/class08_12/Code02_IsBST.java rename to src/class12/Code02_IsBST.java index 6ff2f10..30d99dc 100644 --- a/src/class08_12/Code02_IsBST.java +++ b/src/class12/Code02_IsBST.java @@ -1,4 +1,4 @@ -package class08_12; +package class12; import java.util.ArrayList; diff --git a/src/class12/Code02_StickersToSpellWord.java b/src/class12/Code02_StickersToSpellWord.java deleted file mode 100644 index 808cc1e..0000000 --- a/src/class12/Code02_StickersToSpellWord.java +++ /dev/null @@ -1,152 +0,0 @@ -package class12; - -import java.util.Arrays; -import java.util.HashMap; - -public class Code02_StickersToSpellWord { - - public static int minStickers1(String[] stickers, String target) { - - int n = stickers.length; - - int[][] map = new int[n][26];// stickers -> [26] [26] [26] - for (int i = 0; i < n; i++) { - char[] str = stickers[i].toCharArray(); - for (char c : str) { - map[i][c - 'a']++; - } - } - HashMap dp = new HashMap<>(); - dp.put("", 0); - return process1(dp, map, target); - } - - // dp 傻缓存,如果t已经算过了,直接返回dp中的值 - // t 剩余的目标 - // 0..N每一个字符串所含字符的词频统计 - // 返回值是-1,map 中的贴纸 怎么都无法rest - public static int process1( - HashMap dp, - int[][] map, - String rest) { - if (dp.containsKey(rest)) { - return dp.get(rest); - } - // 以下就是正式的递归调用过程 - int ans = Integer.MAX_VALUE; // ans -> 搞定rest,使用的最少的贴纸数量 - int n = map.length; // N种贴纸 - int[] tmap = new int[26]; // tmap 去替代 rest - char[] target = rest.toCharArray(); - for (char c : target) { - tmap[c - 'a']++; - } - for (int i = 0; i < n; i++) { - // 枚举当前第一张贴纸是谁? - if (map[i][target[0] - 'a'] == 0) { - continue; - } - StringBuilder sb = new StringBuilder(); - // i 贴纸, j 枚举a~z字符 - for (int j = 0; j < 26; j++) { // - if (tmap[j] > 0) { // j这个字符是target需要的 - for (int k = 0; k < Math.max(0, tmap[j] - map[i][j]); k++) { - sb.append((char) ('a' + j)); - } - } - } - // sb -> i - String s = sb.toString(); - int tmp = process1(dp, map, s); - if (tmp != -1) { - ans = Math.min(ans, 1 + tmp); - } - } - // ans 系统最大 rest - dp.put(rest, ans == Integer.MAX_VALUE ? -1 : ans); - return dp.get(rest); - } - - public static int minStickers2(String[] stickers, String target) { - int n = stickers.length; - int[][] map = new int[n][26]; - for (int i = 0; i < n; i++) { - char[] str = stickers[i].toCharArray(); - for (char c : str) { - map[i][c - 'a']++; - } - } - char[] str = target.toCharArray(); - int[] tmap = new int[26]; - for (char c : str) { - tmap[c - 'a']++; - } - HashMap dp = new HashMap<>(); - int ans = process2(map, 0, tmap, dp); - return ans; - } - - public static int process2(int[][] map, int i, int[] tmap, HashMap dp) { - StringBuilder keyBuilder = new StringBuilder(); - keyBuilder.append(i + "_"); - for (int asc = 0; asc < 26; asc++) { - if (tmap[asc] != 0) { - keyBuilder.append((char) (asc + 'a') + "_" + tmap[asc] + "_"); - } - } - String key = keyBuilder.toString(); - if (dp.containsKey(key)) { - return dp.get(key); - } - boolean finish = true; - for (int asc = 0; asc < 26; asc++) { - if (tmap[asc] != 0) { - finish = false; - break; - } - } - if (finish) { - dp.put(key, 0); - return 0; - } - if (i == map.length) { - dp.put(key, -1); - return -1; - } - int maxZhang = 0; - for (int asc = 0; asc < 26; asc++) { - if (map[i][asc] != 0 && tmap[asc] != 0) { - maxZhang = Math.max(maxZhang, (tmap[asc] / map[i][asc]) + (tmap[asc] % map[i][asc] == 0 ? 0 : 1)); - } - } - int[] backup = Arrays.copyOf(tmap, tmap.length); - int min = Integer.MAX_VALUE; - int next = process2(map, i + 1, tmap, dp); - tmap = Arrays.copyOf(backup, backup.length); - if (next != -1) { - min = next; - } - for (int zhang = 1; zhang <= maxZhang; zhang++) { - for (int asc = 0; asc < 26; asc++) { - tmap[asc] = Math.max(0, tmap[asc] - (map[i][asc] * zhang)); - } - next = process2(map, i + 1, tmap, dp); - tmap = Arrays.copyOf(backup, backup.length); - if (next != -1) { - min = Math.min(min, zhang + next); - } - } - int ans = min == Integer.MAX_VALUE ? -1 : min; - dp.put(key, ans); - return ans; - } - - public static void main(String[] args) { - String[] arr = {"aaaa","bbaa","ccddd"}; - String str = "abcccccdddddbbbaaaaa"; - System.out.println(minStickers1(arr, str)); - System.out.println(minStickers2(arr, str)); - - - } - -} diff --git a/src/class08_12/Code03_IsBalanced.java b/src/class12/Code03_IsBalanced.java similarity index 99% rename from src/class08_12/Code03_IsBalanced.java rename to src/class12/Code03_IsBalanced.java index df44cee..e8a6c0f 100644 --- a/src/class08_12/Code03_IsBalanced.java +++ b/src/class12/Code03_IsBalanced.java @@ -1,4 +1,4 @@ -package class08_12; +package class12; public class Code03_IsBalanced { diff --git a/src/class12/Code04_CardsInLine.java b/src/class12/Code04_CardsInLine.java deleted file mode 100644 index 37ad9e4..0000000 --- a/src/class12/Code04_CardsInLine.java +++ /dev/null @@ -1,61 +0,0 @@ -package class12; - -public class Code04_CardsInLine { - - public static int win1(int[] arr) { - if (arr == null || arr.length == 0) { - return 0; - } - return Math.max(f(arr, 0, arr.length - 1), s(arr, 0, arr.length - 1)); - } - - public static int f(int[] arr, int L, int R) { - if (L == R) { - return arr[L]; - } - return Math.max(arr[L] + s(arr, L + 1, R), arr[R] + s(arr, L, R - 1)); - } - - public static int s(int[] arr, int L, int R) { - if (L == R) { - return 0; - } - return Math.min(f(arr, L + 1, R), f(arr, L, R - 1)); - } - - public static int windp(int[] arr) { - if (arr == null || arr.length == 0) { - return 0; - } - int N = arr.length; - int[][] f = new int[N][N]; - int[][] s = new int[N][N]; - for (int i = 0; i < N; i++) { - f[i][i] = arr[i]; - } - // 0,0 右下方移动 - // 0,1 - // 0,2 - // 0,N-1 - for (int col = 1; col < N; col++) { - // 对角线出发位置(0,col) - int L = 0; - int R = col; - while (L < N && R < N) { - f[L][R] = Math.max(arr[L] + s[L + 1][R], arr[R] + s[L][R - 1]); - s[L][R] = Math.min(f[L + 1][R], f[L][R - 1]); - L++; - R++; - } - } - return Math.max(f[0][N - 1], s[0][N - 1]); - } - - public static void main(String[] args) { - int[] arr = { 5, 7, 4, 5, 8, 1, 6, 0, 3, 4, 6, 1, 7 }; - System.out.println(win1(arr)); - System.out.println(windp(arr)); - - } - -} diff --git a/src/class08_12/Code04_IsFull.java b/src/class12/Code04_IsFull.java similarity index 99% rename from src/class08_12/Code04_IsFull.java rename to src/class12/Code04_IsFull.java index ef04e12..0366ff8 100644 --- a/src/class08_12/Code04_IsFull.java +++ b/src/class12/Code04_IsFull.java @@ -1,4 +1,4 @@ -package class08_12; +package class12; public class Code04_IsFull { diff --git a/src/class08_12/Code05_MaxSubBSTSize.java b/src/class12/Code05_MaxSubBSTSize.java similarity index 99% rename from src/class08_12/Code05_MaxSubBSTSize.java rename to src/class12/Code05_MaxSubBSTSize.java index db29d17..bd17329 100644 --- a/src/class08_12/Code05_MaxSubBSTSize.java +++ b/src/class12/Code05_MaxSubBSTSize.java @@ -1,4 +1,4 @@ -package class08_12; +package class12; import java.util.ArrayList; diff --git a/src/class12/Code05_PalindromeSubsequence.java b/src/class12/Code05_PalindromeSubsequence.java deleted file mode 100644 index 9b4faf0..0000000 --- a/src/class12/Code05_PalindromeSubsequence.java +++ /dev/null @@ -1,38 +0,0 @@ -package class12; - -public class Code05_PalindromeSubsequence { - - public static int lcse(char[] str1, char[] str2) { - - - - - int[][] dp = new int[str1.length][str2.length]; - - - - dp[0][0] = str1[0] == str2[0] ? 1 : 0; - - - for (int i = 1; i < str1.length; i++) { - dp[i][0] = Math.max(dp[i - 1][0], str1[i] == str2[0] ? 1 : 0); - } - for (int j = 1; j < str2.length; j++) { - dp[0][j] = Math.max(dp[0][j - 1], str1[0] == str2[j] ? 1 : 0); - } - for (int i = 1; i < str1.length; i++) { - for (int j = 1; j < str2.length; j++) { - dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); - if (str1[i] == str2[j]) { - dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + 1); - } - } - } - return dp[str1.length - 1][str2.length - 1]; - } - - public static void main(String[] args) { - - } - -} diff --git a/src/class08_12/Code06_MaxDistance.java b/src/class12/Code06_MaxDistance.java similarity index 99% rename from src/class08_12/Code06_MaxDistance.java rename to src/class12/Code06_MaxDistance.java index f624e05..8c82c0e 100644 --- a/src/class08_12/Code06_MaxDistance.java +++ b/src/class12/Code06_MaxDistance.java @@ -1,4 +1,4 @@ -package class08_12; +package class12; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/class12/Code09_CoinsWay.java b/src/class12/Code09_CoinsWay.java deleted file mode 100644 index 068c160..0000000 --- a/src/class12/Code09_CoinsWay.java +++ /dev/null @@ -1,106 +0,0 @@ -package class12; - -public class Code09_CoinsWay { - - // arr中都是正数且无重复值,返回组成aim的方法数 - public static int ways1(int[] arr, int aim) { - if (arr == null || arr.length == 0 || aim < 0) { - return 0; - } - return process1(arr, 0, aim); - } - - public static int process1(int[] arr, int index, int rest) { - if(index == arr.length) { - return rest == 0 ? 1 : 0 ; - } - int ways = 0; - for(int zhang = 0; zhang * arr[index] <= rest ;zhang++) { - ways += process1(arr, index + 1, rest - (zhang * arr[index]) ); - } - return ways; - } - - public static int ways2(int[] arr, int aim) { - if (arr == null || arr.length == 0 || aim < 0) { - return 0; - } - int[][] dp = new int[arr.length+1][aim+1]; - // 一开始所有的过程,都没有计算呢 - // dp[..][..] = -1 - for(int i = 0 ; i < dp.length; i++) { - for(int j = 0 ; j < dp[0].length; j++) { - dp[i][j] = -1; - } - } - return process2(arr, 0, aim , dp); - } - - // 如果index和rest的参数组合,是没算过的,dp[index][rest] == -1 - // 如果index和rest的参数组合,是算过的,dp[index][rest] > - 1 - public static int process2(int[] arr, - int index, int rest, - int[][] dp) { - if(dp[index][rest] != -1) { - return dp[index][rest]; - } - if(index == arr.length) { - dp[index][rest] = rest == 0 ? 1 :0; - return dp[index][rest]; - } - int ways = 0; - for(int zhang = 0; zhang * arr[index] <= rest ;zhang++) { - ways += process2(arr, index + 1, rest - (zhang * arr[index]) , dp ); - } - dp[index][rest] = ways; - return ways; - } - - public static int ways3(int[] arr, int aim) { - if (arr == null || arr.length == 0 || aim < 0) { - return 0; - } - int N = arr.length; - int[][] dp = new int[N + 1][aim + 1]; - dp[N][0] = 1;// dp[N][1...aim] = 0; - for(int index = N - 1; index >= 0; index--) { - for(int rest = 0; rest <= aim; rest++) { - int ways = 0; - for(int zhang = 0; zhang * arr[index] <= rest ;zhang++) { - ways += dp[index + 1] [rest - (zhang * arr[index])]; - } - dp[index][rest] = ways; - } - } - return dp[0][aim]; - } - - public static int ways4(int[] arr, int aim) { - if (arr == null || arr.length == 0 || aim < 0) { - return 0; - } - int N = arr.length; - int[][] dp = new int[N + 1][aim + 1]; - dp[N][0] = 1;// dp[N][1...aim] = 0; - for(int index = N - 1; index >= 0; index--) { - for(int rest = 0; rest <= aim; rest++) { - dp[index][rest] = dp[index+1][rest]; - if(rest - arr[index] >= 0) { - dp[index][rest] += dp[index][rest - arr[index]]; - } - } - } - return dp[0][aim]; - } - - - public static void main(String[] args) { - int[] arr = { 5, 10,50,100 }; - int sum = 1000; - System.out.println(ways1(arr, sum)); - System.out.println(ways2(arr, sum)); - System.out.println(ways3(arr, sum)); - System.out.println(ways4(arr, sum)); - } - -} diff --git a/src/class08_13/Code01_IsCBT.java b/src/class13/Code01_IsCBT.java similarity index 99% rename from src/class08_13/Code01_IsCBT.java rename to src/class13/Code01_IsCBT.java index 63924d7..da365d1 100644 --- a/src/class08_13/Code01_IsCBT.java +++ b/src/class13/Code01_IsCBT.java @@ -1,4 +1,4 @@ -package class08_13; +package class13; import java.util.LinkedList; diff --git a/src/class08_13/Code02_MaxSubBSTHead.java b/src/class13/Code02_MaxSubBSTHead.java similarity index 99% rename from src/class08_13/Code02_MaxSubBSTHead.java rename to src/class13/Code02_MaxSubBSTHead.java index b3f5c2b..e64c37a 100644 --- a/src/class08_13/Code02_MaxSubBSTHead.java +++ b/src/class13/Code02_MaxSubBSTHead.java @@ -1,4 +1,4 @@ -package class08_13; +package class13; import java.util.ArrayList; diff --git a/src/class08_13/Code03_lowestAncestor.java b/src/class13/Code03_lowestAncestor.java similarity index 99% rename from src/class08_13/Code03_lowestAncestor.java rename to src/class13/Code03_lowestAncestor.java index 48eb66c..e2a9d5f 100644 --- a/src/class08_13/Code03_lowestAncestor.java +++ b/src/class13/Code03_lowestAncestor.java @@ -1,4 +1,4 @@ -package class08_13; +package class13; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/class08_13/Code04_MaxHappy.java b/src/class13/Code04_MaxHappy.java similarity index 99% rename from src/class08_13/Code04_MaxHappy.java rename to src/class13/Code04_MaxHappy.java index 4cc0b57..3cb21e7 100644 --- a/src/class08_13/Code04_MaxHappy.java +++ b/src/class13/Code04_MaxHappy.java @@ -1,4 +1,4 @@ -package class08_13; +package class13; import java.util.ArrayList; import java.util.List; diff --git a/src/class09_13/Code01_LowestLexicography.java b/src/class13/Code05_LowestLexicography.java similarity index 97% rename from src/class09_13/Code01_LowestLexicography.java rename to src/class13/Code05_LowestLexicography.java index 08dbd52..13ceedd 100644 --- a/src/class09_13/Code01_LowestLexicography.java +++ b/src/class13/Code05_LowestLexicography.java @@ -1,10 +1,10 @@ -package class09_13; +package class13; import java.util.Arrays; import java.util.Comparator; import java.util.TreeSet; -public class Code01_LowestLexicography { +public class Code05_LowestLexicography { public static String lowestString1(String[] strs) { if (strs == null || strs.length == 0) { diff --git a/src/class09_14/Code01_Light.java b/src/class14/Code01_Light.java similarity index 95% rename from src/class09_14/Code01_Light.java rename to src/class14/Code01_Light.java index 0dba03a..05a987f 100644 --- a/src/class09_14/Code01_Light.java +++ b/src/class14/Code01_Light.java @@ -1,4 +1,4 @@ -package class09_14; +package class14; import java.util.HashSet; diff --git a/src/class09_14/Code02_LessMoneySplitGold.java b/src/class14/Code02_LessMoneySplitGold.java similarity index 98% rename from src/class09_14/Code02_LessMoneySplitGold.java rename to src/class14/Code02_LessMoneySplitGold.java index 8f50521..682fa12 100644 --- a/src/class09_14/Code02_LessMoneySplitGold.java +++ b/src/class14/Code02_LessMoneySplitGold.java @@ -1,4 +1,4 @@ -package class09_14; +package class14; import java.util.PriorityQueue; diff --git a/src/class09_14/Code03_BestArrange.java b/src/class14/Code03_BestArrange.java similarity index 99% rename from src/class09_14/Code03_BestArrange.java rename to src/class14/Code03_BestArrange.java index 3d4fe4b..c8a79ff 100644 --- a/src/class09_14/Code03_BestArrange.java +++ b/src/class14/Code03_BestArrange.java @@ -1,4 +1,4 @@ -package class09_14; +package class14; import java.util.Arrays; import java.util.Comparator; diff --git a/src/class09_14/Code04_IPO.java b/src/class14/Code04_IPO.java similarity index 98% rename from src/class09_14/Code04_IPO.java rename to src/class14/Code04_IPO.java index eec4c97..0ac3b85 100644 --- a/src/class09_14/Code04_IPO.java +++ b/src/class14/Code04_IPO.java @@ -1,4 +1,4 @@ -package class09_14; +package class14; import java.util.Comparator; import java.util.PriorityQueue; diff --git a/src/class09_14/Code05_UnionFind.java b/src/class14/Code05_UnionFind.java similarity index 94% rename from src/class09_14/Code05_UnionFind.java rename to src/class14/Code05_UnionFind.java index 7774e54..0d9e246 100644 --- a/src/class09_14/Code05_UnionFind.java +++ b/src/class14/Code05_UnionFind.java @@ -1,4 +1,4 @@ -package class09_14; +package class14; import java.util.HashMap; import java.util.List; diff --git a/src/class09_15/Code01_FriendCircles.java b/src/class15/Code01_FriendCircles.java similarity index 98% rename from src/class09_15/Code01_FriendCircles.java rename to src/class15/Code01_FriendCircles.java index 5f2ad67..dd4253d 100644 --- a/src/class09_15/Code01_FriendCircles.java +++ b/src/class15/Code01_FriendCircles.java @@ -1,4 +1,4 @@ -package class09_15; +package class15; // 本题为leetcode原题 // 测试链接:https://leetcode.com/problems/friend-circles/ diff --git a/src/class09_15/Code02_NumberOfIslands.java b/src/class15/Code02_NumberOfIslands.java similarity index 99% rename from src/class09_15/Code02_NumberOfIslands.java rename to src/class15/Code02_NumberOfIslands.java index e27a9ea..6065d42 100644 --- a/src/class09_15/Code02_NumberOfIslands.java +++ b/src/class15/Code02_NumberOfIslands.java @@ -1,4 +1,4 @@ -package class09_15; +package class15; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/class09_15/Code03_NumberOfIslandsII.java b/src/class15/Code03_NumberOfIslandsII.java similarity index 99% rename from src/class09_15/Code03_NumberOfIslandsII.java rename to src/class15/Code03_NumberOfIslandsII.java index 409fa3a..d109276 100644 --- a/src/class09_15/Code03_NumberOfIslandsII.java +++ b/src/class15/Code03_NumberOfIslandsII.java @@ -1,4 +1,4 @@ -package class09_15; +package class15; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/class10_16/Code01_BFS.java b/src/class16/Code01_BFS.java similarity index 96% rename from src/class10_16/Code01_BFS.java rename to src/class16/Code01_BFS.java index 3a6ac94..c2d4d9f 100644 --- a/src/class10_16/Code01_BFS.java +++ b/src/class16/Code01_BFS.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; import java.util.HashSet; import java.util.LinkedList; diff --git a/src/class10_16/Code02_DFS.java b/src/class16/Code02_DFS.java similarity index 96% rename from src/class10_16/Code02_DFS.java rename to src/class16/Code02_DFS.java index 4e29e8f..fa85ca4 100644 --- a/src/class10_16/Code02_DFS.java +++ b/src/class16/Code02_DFS.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; import java.util.HashSet; import java.util.Stack; diff --git a/src/class10_16/Code03_TopologicalOrderBFS.java b/src/class16/Code03_TopologicalOrderBFS.java similarity index 98% rename from src/class10_16/Code03_TopologicalOrderBFS.java rename to src/class16/Code03_TopologicalOrderBFS.java index f672e78..5e54581 100644 --- a/src/class10_16/Code03_TopologicalOrderBFS.java +++ b/src/class16/Code03_TopologicalOrderBFS.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/class10_16/Code03_TopologicalOrderDFS1.java b/src/class16/Code03_TopologicalOrderDFS1.java similarity index 98% rename from src/class10_16/Code03_TopologicalOrderDFS1.java rename to src/class16/Code03_TopologicalOrderDFS1.java index 35c74f0..57f1bb7 100644 --- a/src/class10_16/Code03_TopologicalOrderDFS1.java +++ b/src/class16/Code03_TopologicalOrderDFS1.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; import java.util.ArrayList; import java.util.Comparator; diff --git a/src/class10_16/Code03_TopologicalOrderDFS2.java b/src/class16/Code03_TopologicalOrderDFS2.java similarity index 98% rename from src/class10_16/Code03_TopologicalOrderDFS2.java rename to src/class16/Code03_TopologicalOrderDFS2.java index bbecfa5..4c90d1d 100644 --- a/src/class10_16/Code03_TopologicalOrderDFS2.java +++ b/src/class16/Code03_TopologicalOrderDFS2.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; import java.util.ArrayList; import java.util.Comparator; diff --git a/src/class10_16/Code03_TopologySort.java b/src/class16/Code03_TopologySort.java similarity index 97% rename from src/class10_16/Code03_TopologySort.java rename to src/class16/Code03_TopologySort.java index aa25007..735dca0 100644 --- a/src/class10_16/Code03_TopologySort.java +++ b/src/class16/Code03_TopologySort.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/class10_16/Code04_Kruskal.java b/src/class16/Code04_Kruskal.java similarity index 99% rename from src/class10_16/Code04_Kruskal.java rename to src/class16/Code04_Kruskal.java index 03ef6c4..cb0ea62 100644 --- a/src/class10_16/Code04_Kruskal.java +++ b/src/class16/Code04_Kruskal.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; import java.util.Collection; import java.util.Comparator; diff --git a/src/class10_16/Code05_Prim.java b/src/class16/Code05_Prim.java similarity index 99% rename from src/class10_16/Code05_Prim.java rename to src/class16/Code05_Prim.java index c8ace77..d00dc75 100644 --- a/src/class10_16/Code05_Prim.java +++ b/src/class16/Code05_Prim.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; import java.util.Comparator; import java.util.HashSet; diff --git a/src/class10_16/Code06_Dijkstra.java b/src/class16/Code06_Dijkstra.java similarity index 99% rename from src/class10_16/Code06_Dijkstra.java rename to src/class16/Code06_Dijkstra.java index a50528a..9cb6258 100644 --- a/src/class10_16/Code06_Dijkstra.java +++ b/src/class16/Code06_Dijkstra.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; import java.util.HashMap; import java.util.HashSet; diff --git a/src/class10_16/Edge.java b/src/class16/Edge.java similarity index 90% rename from src/class10_16/Edge.java rename to src/class16/Edge.java index 3b8e939..7c56891 100644 --- a/src/class10_16/Edge.java +++ b/src/class16/Edge.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; public class Edge { public int weight; diff --git a/src/class10_16/Graph.java b/src/class16/Graph.java similarity index 91% rename from src/class10_16/Graph.java rename to src/class16/Graph.java index d7556e8..933e43b 100644 --- a/src/class10_16/Graph.java +++ b/src/class16/Graph.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; import java.util.HashMap; import java.util.HashSet; diff --git a/src/class10_16/GraphGenerator.java b/src/class16/GraphGenerator.java similarity index 97% rename from src/class10_16/GraphGenerator.java rename to src/class16/GraphGenerator.java index 4c07bc5..fe3387d 100644 --- a/src/class10_16/GraphGenerator.java +++ b/src/class16/GraphGenerator.java @@ -1,4 +1,4 @@ -package class10_16; +package class16; public class GraphGenerator { diff --git a/src/class10_17/Node.java b/src/class16/Node.java similarity index 94% rename from src/class10_17/Node.java rename to src/class16/Node.java index 79a92d3..a468aaf 100644 --- a/src/class10_17/Node.java +++ b/src/class16/Node.java @@ -1,4 +1,4 @@ -package class10_17; +package class16; import java.util.ArrayList; diff --git a/src/class10_17/Code01_Dijkstra.java b/src/class17/Code01_Dijkstra.java similarity index 91% rename from src/class10_17/Code01_Dijkstra.java rename to src/class17/Code01_Dijkstra.java index 8e38bb4..0b39615 100644 --- a/src/class10_17/Code01_Dijkstra.java +++ b/src/class17/Code01_Dijkstra.java @@ -1,4 +1,4 @@ -package class10_17; +package class17; import java.util.HashMap; import java.util.HashSet; @@ -14,13 +14,13 @@ public class Code01_Dijkstra { HashSet selectedNodes = new HashSet<>(); Node minNode = getMinDistanceAndUnselectedNode(distanceMap, selectedNodes); while (minNode != null) { - // 原始点 -> minNode(跳转点) 最小距离distance + // 原始点 -> minNode(跳转点) 最小距离distance int distance = distanceMap.get(minNode); for (Edge edge : minNode.edges) { Node toNode = edge.to; if (!distanceMap.containsKey(toNode)) { distanceMap.put(toNode, distance + edge.weight); - } else { // toNode + } else { // toNode distanceMap.put(edge.to, Math.min(distanceMap.get(toNode), distance + edge.weight)); } } @@ -55,12 +55,13 @@ public class Code01_Dijkstra { } public static class NodeHeap { - private Node[] nodes; // 实际的堆结构 - // key 某一个node, value 上面堆中的位置 + // 堆! + private Node[] nodes; + // node -> 堆上的什么位置? + private HashMap heapIndexMap; - // key 某一个节点, value 从源节点出发到该节点的目前最小距离 private HashMap distanceMap; - private int size; // 堆上有多少个点 + private int size; public NodeHeap(int size) { nodes = new Node[size]; @@ -76,21 +77,22 @@ public class Code01_Dijkstra { // 有一个点叫node,现在发现了一个从源节点出发到达node的距离为distance // 判断要不要更新,如果需要的话,就更新 public void addOrUpdateOrIgnore(Node node, int distance) { - if (inHeap(node)) { + if (inHeap(node)) { // update distanceMap.put(node, Math.min(distanceMap.get(node), distance)); insertHeapify(node, heapIndexMap.get(node)); } - if (!isEntered(node)) { + if (!isEntered(node)) { // add nodes[size] = node; heapIndexMap.put(node, size); distanceMap.put(node, distance); insertHeapify(node, size++); } + // ignore } public NodeRecord pop() { NodeRecord nodeRecord = new NodeRecord(nodes[0], distanceMap.get(nodes[0])); - swap(0, size - 1); + swap(0, size - 1); // 0 > size - 1 size - 1 > 0 heapIndexMap.put(nodes[size - 1], -1); distanceMap.remove(nodes[size - 1]); // free C++同学还要把原本堆顶节点析构,对java同学不必 diff --git a/src/class11_17/Code01_Hanoi.java b/src/class17/Code02_Hanoi.java similarity index 94% rename from src/class11_17/Code01_Hanoi.java rename to src/class17/Code02_Hanoi.java index 4b3966c..3d9ba6e 100644 --- a/src/class11_17/Code01_Hanoi.java +++ b/src/class17/Code02_Hanoi.java @@ -1,8 +1,8 @@ -package class11_17; +package class17; import java.util.Stack; -public class Code01_Hanoi { +public class Code02_Hanoi { public static void hanoi1(int n) { leftToRight(n); @@ -10,7 +10,7 @@ public class Code01_Hanoi { // 请把1~N层圆盘 从左 -> 右 public static void leftToRight(int n) { - if (n == 1) { + if (n == 1) { // base case System.out.println("Move 1 from left to right"); return; } @@ -76,7 +76,6 @@ public class Code01_Hanoi { } } - // 1~i 圆盘 目标是from -> to, other是另外一个 public static void func(int N, String from, String to, String other) { if (N == 1) { // base System.out.println("Move 1 from " + from + " to " + to); @@ -133,8 +132,8 @@ public class Code01_Hanoi { hanoi1(n); System.out.println("============"); hanoi2(n); - System.out.println("============"); - hanoi3(n); +// System.out.println("============"); +// hanoi3(n); } } diff --git a/src/class11_17/Code02_PrintAllSubsquences.java b/src/class17/Code03_PrintAllSubsquences.java similarity index 64% rename from src/class11_17/Code02_PrintAllSubsquences.java rename to src/class17/Code03_PrintAllSubsquences.java index 505e878..05b6a03 100644 --- a/src/class11_17/Code02_PrintAllSubsquences.java +++ b/src/class17/Code03_PrintAllSubsquences.java @@ -1,11 +1,12 @@ -package class11_17; +package class17; import java.util.ArrayList; import java.util.HashSet; import java.util.List; -public class Code02_PrintAllSubsquences { +public class Code03_PrintAllSubsquences { + // s -> "abc" -> public static List subs(String s) { char[] str = s.toCharArray(); String path = ""; @@ -14,19 +15,21 @@ public class Code02_PrintAllSubsquences { return ans; } - // str固定,不变 - // index此时来到的位置, 要 or 不要 - // 如果index来到了str中的终止位置,把沿途路径所形成的答案,放入ans中 - // 之前做出的选择,就是path + // str 固定参数 + // 来到了str[index]字符,index是位置 + // str[0..index-1]已经走过了!之前的决定,都在path上 + // 之前的决定已经不能改变了,就是path + // str[index....]还能决定,之前已经确定,而后面还能自由选择的话, + // 把所有生成的子序列,放入到ans里去 public static void process1(char[] str, int index, List ans, String path) { if (index == str.length) { ans.add(path); return; } - String no = path; - process1(str, index + 1, ans, no); - String yes = path + String.valueOf(str[index]); - process1(str, index + 1, ans, yes); + // 没有要index位置的字符 + process1(str, index + 1, ans, path); + // 要了index位置的字符 + process1(str, index + 1, ans, path + String.valueOf(str[index])); } public static List subsNoRepeat(String s) { @@ -41,9 +44,7 @@ public class Code02_PrintAllSubsquences { return ans; } - // str index set - public static void process2(char[] str, int index, - HashSet set, String path) { + public static void process2(char[] str, int index, HashSet set, String path) { if (index == str.length) { set.add(path); return; @@ -55,7 +56,7 @@ public class Code02_PrintAllSubsquences { } public static void main(String[] args) { - String test = "aacc"; + String test = "acccc"; List ans1 = subs(test); List ans2 = subsNoRepeat(test); diff --git a/src/class17/Code04_PrintAllPermutations.java b/src/class17/Code04_PrintAllPermutations.java new file mode 100644 index 0000000..0337a95 --- /dev/null +++ b/src/class17/Code04_PrintAllPermutations.java @@ -0,0 +1,110 @@ +package class17; + +import java.util.ArrayList; +import java.util.List; + +public class Code04_PrintAllPermutations { + + public static List permutation1(String s) { + List ans = new ArrayList<>(); + if (s == null || s.length() == 0) { + return ans; + } + char[] str = s.toCharArray(); + ArrayList rest = new ArrayList(); + for (char cha : str) { + rest.add(cha); + } + String path = ""; + f(rest, path, ans); + return ans; + } + + public static void f(ArrayList rest, String path, List ans) { + if (rest.isEmpty()) { + ans.add(path); + } else { + int N = rest.size(); + for (int i = 0; i < N; i++) { + char cur = rest.get(i); + rest.remove(i); + f(rest, path + cur, ans); + rest.add(i, cur); + } + } + } + + public static List permutation2(String s) { + List ans = new ArrayList<>(); + if (s == null || s.length() == 0) { + return ans; + } + char[] str = s.toCharArray(); + g1(str, 0, ans); + return ans; + } + + public static void g1(char[] str, int index, List ans) { + if (index == str.length) { + ans.add(String.valueOf(str)); + } else { + for (int i = index; i < str.length; i++) { + swap(str, index, i); + g1(str, index + 1, ans); + swap(str, index, i); + } + } + } + + public static List permutation3(String s) { + List ans = new ArrayList<>(); + if (s == null || s.length() == 0) { + return ans; + } + char[] str = s.toCharArray(); + g2(str, 0, ans); + return ans; + } + + public static void g2(char[] str, int index, List ans) { + if (index == str.length) { + ans.add(String.valueOf(str)); + } else { + boolean[] visited = new boolean[256]; + for (int i = index; i < str.length; i++) { + if (!visited[str[i]]) { + visited[str[i]] = true; + swap(str, index, i); + g2(str, index + 1, ans); + swap(str, index, i); + } + } + } + } + + public static void swap(char[] chs, int i, int j) { + char tmp = chs[i]; + chs[i] = chs[j]; + chs[j] = tmp; + } + + public static void main(String[] args) { + String s = "acc"; + List ans1 = permutation1(s); + for (String str : ans1) { + System.out.println(str); + } + System.out.println("======="); + List ans2 = permutation2(s); + for (String str : ans2) { + System.out.println(str); + } + System.out.println("======="); + List ans3 = permutation3(s); + for (String str : ans3) { + System.out.println(str); + } + + } + +} diff --git a/src/class11_17/Code04_ReverseStackUsingRecursive.java b/src/class17/Code05_ReverseStackUsingRecursive.java similarity index 80% rename from src/class11_17/Code04_ReverseStackUsingRecursive.java rename to src/class17/Code05_ReverseStackUsingRecursive.java index 4653b9b..731056a 100644 --- a/src/class11_17/Code04_ReverseStackUsingRecursive.java +++ b/src/class17/Code05_ReverseStackUsingRecursive.java @@ -1,8 +1,8 @@ -package class11_17; +package class17; import java.util.Stack; -public class Code04_ReverseStackUsingRecursive { +public class Code05_ReverseStackUsingRecursive { public static void reverse(Stack stack) { if (stack.isEmpty()) { @@ -13,6 +13,9 @@ public class Code04_ReverseStackUsingRecursive { stack.push(i); } + // 栈底元素移除掉 + // 上面的元素盖下来 + // 返回移除掉的栈底元素 public static int f(Stack stack) { int result = stack.pop(); if (stack.isEmpty()) { diff --git a/src/class10_17/Edge.java b/src/class17/Edge.java similarity index 90% rename from src/class10_17/Edge.java rename to src/class17/Edge.java index b4389ea..eacd58b 100644 --- a/src/class10_17/Edge.java +++ b/src/class17/Edge.java @@ -1,4 +1,4 @@ -package class10_17; +package class17; public class Edge { public int weight; diff --git a/src/class10_17/Graph.java b/src/class17/Graph.java similarity index 91% rename from src/class10_17/Graph.java rename to src/class17/Graph.java index 3901b78..f9314a2 100644 --- a/src/class10_17/Graph.java +++ b/src/class17/Graph.java @@ -1,4 +1,4 @@ -package class10_17; +package class17; import java.util.HashMap; import java.util.HashSet; diff --git a/src/class10_16/Node.java b/src/class17/Node.java similarity index 94% rename from src/class10_16/Node.java rename to src/class17/Node.java index 1a57f35..1056ead 100644 --- a/src/class10_16/Node.java +++ b/src/class17/Node.java @@ -1,4 +1,4 @@ -package class10_16; +package class17; import java.util.ArrayList; diff --git a/src/class18/Code01_RobotWalk.java b/src/class18/Code01_RobotWalk.java new file mode 100644 index 0000000..f9ee3f2 --- /dev/null +++ b/src/class18/Code01_RobotWalk.java @@ -0,0 +1,94 @@ +package class18; + +public class Code01_RobotWalk { + + public static int ways1(int N, int start, int aim, int K) { + if (N < 2 || start < 1 || start > N || aim < 1 || aim > N || K < 1) { + return -1; + } + return process1(start, K, aim, N); + } + + // 机器人当前来到的位置是cur, + // 机器人还有rest步需要去走, + // 最终的目标是aim, + // 有哪些位置?1~N + // 返回:机器人从cur出发,走过rest步之后,最终停在aim的方法数,是多少? + public static int process1(int cur, int rest, int aim, int N) { + if (rest == 0) { // 如果已经不需要走了,走完了! + return cur == aim ? 1 : 0; + } + // (cur, rest) + if (cur == 1) { // 1 -> 2 + return process1(2, rest - 1, aim, N); + } + // (cur, rest) + if (cur == N) { // N-1 <- N + return process1(N - 1, rest - 1, aim, N); + } + // (cur, rest) + return process1(cur - 1, rest - 1, aim, N) + process1(cur + 1, rest - 1, aim, N); + } + + public static int ways2(int N, int start, int aim, int K) { + if (N < 2 || start < 1 || start > N || aim < 1 || aim > N || K < 1) { + return -1; + } + int[][] dp = new int[N + 1][K + 1]; + for (int i = 0; i <= N; i++) { + for (int j = 0; j <= K; j++) { + dp[i][j] = -1; + } + } + // dp就是缓存表 + // dp[cur][rest] == -1 -> process1(cur, rest)之前没算过! + // dp[cur][rest] != -1 -> process1(cur, rest)之前算过!返回值,dp[cur][rest] + // N+1 * K+1 + return process2(start, K, aim, N, dp); + } + + // cur 范: 1 ~ N + // rest 范:0 ~ K + public static int process2(int cur, int rest, int aim, int N, int[][] dp) { + if (dp[cur][rest] != -1) { + return dp[cur][rest]; + } + // 之前没算过! + int ans = 0; + if (rest == 0) { + ans = cur == aim ? 1 : 0; + } else if (cur == 1) { + ans = process2(2, rest - 1, aim, N, dp); + } else if (cur == N) { + ans = process2(N - 1, rest - 1, aim, N, dp); + } else { + ans = process2(cur - 1, rest - 1, aim, N, dp) + process2(cur + 1, rest - 1, aim, N, dp); + } + dp[cur][rest] = ans; + return ans; + + } + + public static int ways3(int N, int start, int aim, int K) { + if (N < 2 || start < 1 || start > N || aim < 1 || aim > N || K < 1) { + return -1; + } + int[][] dp = new int[N + 1][K + 1]; + dp[aim][0] = 1; + for (int rest = 1; rest <= K; rest++) { + dp[1][rest] = dp[2][rest - 1]; + for (int cur = 2; cur < N; cur++) { + dp[cur][rest] = dp[cur - 1][rest - 1] + dp[cur + 1][rest - 1]; + } + dp[N][rest] = dp[N - 1][rest - 1]; + } + return dp[start][K]; + } + + public static void main(String[] args) { + System.out.println(ways1(5, 2, 4, 6)); + System.out.println(ways2(5, 2, 4, 6)); + System.out.println(ways3(5, 2, 4, 6)); + } + +} diff --git a/src/class18/Code02_CardsInLine.java b/src/class18/Code02_CardsInLine.java new file mode 100644 index 0000000..919a4cb --- /dev/null +++ b/src/class18/Code02_CardsInLine.java @@ -0,0 +1,116 @@ +package class18; + +public class Code02_CardsInLine { + + // 根据规则,返回获胜者的分数 + public static int win1(int[] arr) { + if (arr == null || arr.length == 0) { + return 0; + } + int first = f1(arr, 0, arr.length - 1); + int second = g1(arr, 0, arr.length - 1); + return Math.max(first, second); + } + + // arr[L..R],先手获得的最好分数返回 + public static int f1(int[] arr, int L, int R) { + if (L == R) { + return arr[L]; + } + int p1 = arr[L] + g1(arr, L + 1, R); + int p2 = arr[R] + g1(arr, L, R - 1); + return Math.max(p1, p2); + } + + // // arr[L..R],后手获得的最好分数返回 + public static int g1(int[] arr, int L, int R) { + if (L == R) { + return 0; + } + int p1 = f1(arr, L + 1, R); // 对手拿走了L位置的数 + int p2 = f1(arr, L, R - 1); // 对手拿走了R位置的数 + return Math.min(p1, p2); + } + + public static int win2(int[] arr) { + if (arr == null || arr.length == 0) { + return 0; + } + int N = arr.length; + int[][] fmap = new int[N][N]; + int[][] gmap = new int[N][N]; + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + fmap[i][j] = -1; + gmap[i][j] = -1; + } + } + int first = f2(arr, 0, arr.length - 1, fmap, gmap); + int second = g2(arr, 0, arr.length - 1, fmap, gmap); + return Math.max(first, second); + } + + // arr[L..R],先手获得的最好分数返回 + public static int f2(int[] arr, int L, int R, int[][] fmap, int[][] gmap) { + if (fmap[L][R] != -1) { + return fmap[L][R]; + } + int ans = 0; + if (L == R) { + ans = arr[L]; + } else { + int p1 = arr[L] + g2(arr, L + 1, R, fmap, gmap); + int p2 = arr[R] + g2(arr, L, R - 1, fmap, gmap); + ans = Math.max(p1, p2); + } + fmap[L][R] = ans; + return ans; + } + + // // arr[L..R],后手获得的最好分数返回 + public static int g2(int[] arr, int L, int R, int[][] fmap, int[][] gmap) { + if (gmap[L][R] != -1) { + return gmap[L][R]; + } + int ans = 0; + if (L != R) { + int p1 = f2(arr, L + 1, R, fmap, gmap); // 对手拿走了L位置的数 + int p2 = f2(arr, L, R - 1, fmap, gmap); // 对手拿走了R位置的数 + ans = Math.min(p1, p2); + } + gmap[L][R] = ans; + return ans; + } + + public static int win3(int[] arr) { + if (arr == null || arr.length == 0) { + return 0; + } + int N = arr.length; + int[][] fmap = new int[N][N]; + int[][] gmap = new int[N][N]; + for (int i = 0; i < N; i++) { + fmap[i][i] = arr[i]; + } + for (int startCol = 1; startCol < N; startCol++) { + int L = 0; + int R = startCol; + while (R < N) { + fmap[L][R] = Math.max(arr[L] + gmap[L + 1][R], arr[R] + gmap[L][R - 1]); + gmap[L][R] = Math.min(fmap[L + 1][R], fmap[L][R - 1]); + L++; + R++; + } + } + return Math.max(fmap[0][N - 1], gmap[0][N - 1]); + } + + public static void main(String[] args) { + int[] arr = { 5, 7, 4, 5, 8, 1, 6, 0, 3, 4, 6, 1, 7 }; + System.out.println(win1(arr)); + System.out.println(win2(arr)); + System.out.println(win3(arr)); + + } + +} diff --git a/src/class12/Code03_Knapsack.java b/src/class18/Code03_Knapsack.java similarity index 94% rename from src/class12/Code03_Knapsack.java rename to src/class18/Code03_Knapsack.java index 36b388f..d80c76e 100644 --- a/src/class12/Code03_Knapsack.java +++ b/src/class18/Code03_Knapsack.java @@ -1,4 +1,4 @@ -package class12; +package class18; public class Code03_Knapsack { @@ -44,7 +44,7 @@ public class Code03_Knapsack { int p1 = process(w, v, index + 1, rest); int p2 = -1; int p2Next = process(w, v, index + 1, rest - w[index]); - if(p2Next!=-1) { + if (p2Next != -1) { p2 = v[index] + p2Next; } return Math.max(p1, p2); @@ -56,9 +56,9 @@ public class Code03_Knapsack { // dp[N][...] = 0 for (int index = N - 1; index >= 0; index--) { for (int rest = 0; rest <= bag; rest++) { // rest < 0 - int p1 = dp[index+1][rest]; + int p1 = dp[index + 1][rest]; int p2 = -1; - if(rest - w[index] >= 0) { + if (rest - w[index] >= 0) { p2 = v[index] + dp[index + 1][rest - w[index]]; } dp[index][rest] = Math.max(p1, p2); diff --git a/src/class11_17/Code06_ConvertToLetterString.java b/src/class18/Code04_ConvertToLetterString.java similarity index 79% rename from src/class11_17/Code06_ConvertToLetterString.java rename to src/class18/Code04_ConvertToLetterString.java index 0b66871..99e9825 100644 --- a/src/class11_17/Code06_ConvertToLetterString.java +++ b/src/class18/Code04_ConvertToLetterString.java @@ -1,6 +1,6 @@ -package class11_17; +package class18; -public class Code06_ConvertToLetterString { +public class Code04_ConvertToLetterString { public static int number(String str) { if (str == null || str.length() == 0) { @@ -9,11 +9,8 @@ public class Code06_ConvertToLetterString { return process(str.toCharArray(), 0); } - // str[0...i-1]已经转化完了,固定了 - // i之前的位置,如何转化已经做过决定了, 不用再关心 - // i... 有多少种转化的结果 public static int process(char[] str, int i) { - if (i == str.length) { // base case + if (i == str.length) { return 1; } if (str[i] == '0') { @@ -34,7 +31,7 @@ public class Code06_ConvertToLetterString { return res; } return process(str, i + 1); - } + } public static int dp(String s) { if (s == null || s.length() == 0) { @@ -53,7 +50,7 @@ public class Code06_ConvertToLetterString { dp[i] += dp[i + 2]; } } else if (str[i] == '2') { - dp[i] = dp[i + 1]; + dp[i] = dp[i + 1]; if (i + 1 < str.length && (str[i + 1] >= '0' && str[i + 1] <= '6')) { dp[i] += dp[i + 2]; } diff --git a/src/class18/Code05_StickersToSpellWord.java b/src/class18/Code05_StickersToSpellWord.java new file mode 100644 index 0000000..fcb375c --- /dev/null +++ b/src/class18/Code05_StickersToSpellWord.java @@ -0,0 +1,140 @@ +package class18; + +import java.util.HashMap; + +// 本题测试链接:https://leetcode.com/problems/stickers-to-spell-word +public class Code05_StickersToSpellWord { + + public static int minStickers1(String[] stickers, String target) { + int ans = process1(stickers, target); + return ans == Integer.MAX_VALUE ? -1 : ans; + } + + public static int process1(String[] stickers, String target) { + if (target.length() == 0) { + return 0; + } + int min = Integer.MAX_VALUE; + for (String first : stickers) { + String rest = minus(target, first); + if (rest.length() != target.length()) { + min = Math.min(min, process1(stickers, rest)); + } + } + return min + (min == Integer.MAX_VALUE ? 0 : 1); + } + + public static String minus(String s1, String s2) { + char[] str1 = s1.toCharArray(); + char[] str2 = s2.toCharArray(); + int[] count = new int[26]; + for (char cha : str1) { + count[cha - 'a']++; + } + for (char cha : str2) { + count[cha - 'a']--; + } + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < 26; i++) { + if (count[i] > 0) { + for (int j = 0; j < count[i]; j++) { + builder.append((char) (i + 'a')); + } + } + } + return builder.toString(); + } + + public static int minStickers2(String[] stickers, String target) { + int N = stickers.length; + // 关键优化(用词频表替代贴纸数组) + int[][] counts = new int[N][26]; + for (int i = 0; i < N; i++) { + char[] str = stickers[i].toCharArray(); + for (char cha : str) { + counts[i][cha - 'a']++; + } + } + int ans = process2(counts, target); + return ans == Integer.MAX_VALUE ? -1 : ans; + } + + public static int process2(int[][] stickers, String t) { + if (t.length() == 0) { + return 0; + } + char[] target = t.toCharArray(); + int[] tcounts = new int[26]; + for (char cha : target) { + tcounts[cha - 'a']++; + } + int N = stickers.length; + int min = Integer.MAX_VALUE; + for (int i = 0; i < N; i++) { + int[] sticker = stickers[i]; + // 最关键的优化(重要的剪枝!这一步也是贪心!) + if (sticker[target[0] - 'a'] > 0) { + StringBuilder builder = new StringBuilder(); + for (int j = 0; j < 26; j++) { + if (tcounts[j] > 0) { + int nums = tcounts[j] - sticker[j]; + for (int k = 0; k < nums; k++) { + builder.append((char) (j + 'a')); + } + } + } + String rest = builder.toString(); + min = Math.min(min, process2(stickers, rest)); + } + } + return min + (min == Integer.MAX_VALUE ? 0 : 1); + } + + public static int minStickers3(String[] stickers, String target) { + int N = stickers.length; + int[][] counts = new int[N][26]; + for (int i = 0; i < N; i++) { + char[] str = stickers[i].toCharArray(); + for (char cha : str) { + counts[i][cha - 'a']++; + } + } + HashMap dp = new HashMap<>(); + dp.put("", 0); + int ans = process3(counts, target, dp); + return ans == Integer.MAX_VALUE ? -1 : ans; + } + + public static int process3(int[][] stickers, String t, HashMap dp) { + if (dp.containsKey(t)) { + return dp.get(t); + } + char[] target = t.toCharArray(); + int[] tcounts = new int[26]; + for (char cha : target) { + tcounts[cha - 'a']++; + } + int N = stickers.length; + int min = Integer.MAX_VALUE; + for (int i = 0; i < N; i++) { + int[] sticker = stickers[i]; + if (sticker[target[0] - 'a'] > 0) { + StringBuilder builder = new StringBuilder(); + for (int j = 0; j < 26; j++) { + if (tcounts[j] > 0) { + int nums = tcounts[j] - sticker[j]; + for (int k = 0; k < nums; k++) { + builder.append((char) (j + 'a')); + } + } + } + String rest = builder.toString(); + min = Math.min(min, process3(stickers, rest, dp)); + } + } + int ans = min + (min == Integer.MAX_VALUE ? 0 : 1); + dp.put(t, ans); + return ans; + } + +} diff --git a/src/class12/Code05_LongestCommonSubsequence.java b/src/class19/Code01_LongestCommonSubsequence.java similarity index 96% rename from src/class12/Code05_LongestCommonSubsequence.java rename to src/class19/Code01_LongestCommonSubsequence.java index e3360ee..36e94e4 100644 --- a/src/class12/Code05_LongestCommonSubsequence.java +++ b/src/class19/Code01_LongestCommonSubsequence.java @@ -1,8 +1,8 @@ -package class12; +package class19; // 这个问题leetcode上可以直接测 // 链接:https://leetcode.com/problems/longest-common-subsequence/ -public class Code05_LongestCommonSubsequence { +public class Code01_LongestCommonSubsequence { public static int longestCommonSubsequence1(String text1, String text2) { if (text1 == null || text2 == null || text1.length() == 0 || text2.length() == 0) { diff --git a/src/class19/Code02_PalindromeSubsequence.java b/src/class19/Code02_PalindromeSubsequence.java new file mode 100644 index 0000000..94cf109 --- /dev/null +++ b/src/class19/Code02_PalindromeSubsequence.java @@ -0,0 +1,75 @@ +package class19; + +// 测试链接:https://leetcode.com/problems/longest-palindromic-subsequence/ +public class Code02_PalindromeSubsequence { + + public static int longestPalindromeSubseq1(String s) { + if (s == null || s.length() == 0) { + return 0; + } + if (s.length() == 1) { + return 1; + } + char[] str = s.toCharArray(); + char[] reverse = reverse(str); + return longestCommonSubsequence(str, reverse); + } + + public static char[] reverse(char[] str) { + int N = str.length; + char[] reverse = new char[str.length]; + for (int i = 0; i < str.length; i++) { + reverse[--N] = str[i]; + } + return reverse; + } + + public static int longestCommonSubsequence(char[] str1, char[] str2) { + int N = str1.length; + int M = str2.length; + int[][] dp = new int[N][M]; + dp[0][0] = str1[0] == str2[0] ? 1 : 0; + for (int i = 1; i < N; i++) { + dp[i][0] = str1[i] == str2[0] ? 1 : dp[i - 1][0]; + } + for (int j = 1; j < M; j++) { + dp[0][j] = str1[0] == str2[j] ? 1 : dp[0][j - 1]; + } + for (int i = 1; i < N; i++) { + for (int j = 1; j < M; j++) { + dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); + if (str1[i] == str2[j]) { + dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + 1); + } + } + } + return dp[N - 1][M - 1]; + } + + public static int longestPalindromeSubseq2(String s) { + if (s == null || s.length() == 0) { + return 0; + } + if (s.length() == 1) { + return 1; + } + char[] str = s.toCharArray(); + int N = str.length; + int[][] dp = new int[N][N]; + dp[N - 1][N - 1] = 1; + for (int i = 0; i < N - 1; i++) { + dp[i][i] = 1; + dp[i][i + 1] = str[i] == str[i + 1] ? 2 : 1; + } + for (int i = N - 3; i >= 0; i--) { + for (int j = i + 2; j < N; j++) { + dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j]); + if (str[i] == str[j]) { + dp[i][j] = Math.max(dp[i][j], dp[i + 1][j - 1] + 2); + } + } + } + return dp[0][N - 1]; + } + +} diff --git a/src/class12/Code07_HorseJump.java b/src/class19/Code03_HorseJump.java similarity index 90% rename from src/class12/Code07_HorseJump.java rename to src/class19/Code03_HorseJump.java index 2d2ab17..a560edd 100644 --- a/src/class12/Code07_HorseJump.java +++ b/src/class19/Code03_HorseJump.java @@ -1,16 +1,11 @@ -package class12; +package class19; -public class Code07_HorseJump { +public class Code03_HorseJump { - // 10*9 - // 0~9 y - // 0~8 x public static int ways(int a, int b, int step) { return f(0, 0, step, a, b); } - // 马在(i,j)位置,还有step步要去跳 - // 返回最终来到(a,b)的方法数 public static int f(int i, int j, int step, int a, int b) { if (i < 0 || i > 9 || j < 0 || j > 8) { return 0; @@ -31,7 +26,6 @@ public class Code07_HorseJump { public static int waysdp(int a, int b, int s) { - // (i,j,0~ step) int[][][] dp = new int[10][9][s+1]; dp[a][b][0] = 1; for(int step = 1 ; step <= s;step++ ) { // 按层来 diff --git a/src/class12/Code06_Coffee.java b/src/class19/Code04_Coffee.java similarity index 99% rename from src/class12/Code06_Coffee.java rename to src/class19/Code04_Coffee.java index d5d0613..fec9a7b 100644 --- a/src/class12/Code06_Coffee.java +++ b/src/class19/Code04_Coffee.java @@ -1,4 +1,4 @@ -package class12; +package class19; import java.util.Arrays; import java.util.Comparator; @@ -12,7 +12,7 @@ import java.util.PriorityQueue; // 洗杯子的机器洗完一个杯子时间为a,任何一个杯子自然挥发干净的时间为b。 // 四个参数:arr, n, a, b // 假设时间点从0开始,返回所有人喝完咖啡并洗完咖啡杯的全部过程结束后,至少来到什么时间点。 -public class Code06_Coffee { +public class Code04_Coffee { // 方法一:暴力尝试方法 public static int minTime1(int[] arr, int n, int a, int b) { diff --git a/src/class12/Code08_MinPathSum.java b/src/class19/Code05_MinPathSum.java similarity index 97% rename from src/class12/Code08_MinPathSum.java rename to src/class19/Code05_MinPathSum.java index 9aae0a3..bc8efeb 100644 --- a/src/class12/Code08_MinPathSum.java +++ b/src/class19/Code05_MinPathSum.java @@ -1,6 +1,6 @@ -package class12; +package class19; -public class Code08_MinPathSum { +public class Code05_MinPathSum { public static int minPathSum1(int[][] m) { if (m == null || m.length == 0 || m[0] == null || m[0].length == 0) { diff --git a/src/class20/Code01_CoinsWayEveryPaperDifferent.java b/src/class20/Code01_CoinsWayEveryPaperDifferent.java new file mode 100644 index 0000000..008910d --- /dev/null +++ b/src/class20/Code01_CoinsWayEveryPaperDifferent.java @@ -0,0 +1,76 @@ +package class20; + +public class Code01_CoinsWayEveryPaperDifferent { + + public static int coinWays(int[] arr, int aim) { + return process(arr, 0, aim); + } + + public static int process(int[] arr, int index, int rest) { + if (rest < 0) { + return 0; + } + if (index == arr.length) { + return rest == 0 ? 1 : 0; + } else { + return process(arr, index + 1, rest) + process(arr, index + 1, rest - arr[index]); + } + } + + public static int dp(int[] arr, int aim) { + if (aim == 0) { + return 1; + } + int N = arr.length; + int[][] dp = new int[N + 1][aim + 1]; + dp[N][0] = 1; + for (int index = N - 1; index >= 0; index--) { + for (int rest = 0; rest <= aim; rest++) { + dp[index][rest] = dp[index + 1][rest] + (rest - arr[index] >= 0 ? dp[index + 1][rest - arr[index]] : 0); + } + } + return dp[0][aim]; + } + + // 为了测试 + public static int[] randomArray(int maxLen, int maxValue) { + int N = (int) (Math.random() * maxLen); + int[] arr = new int[N]; + for (int i = 0; i < N; i++) { + arr[i] = (int) (Math.random() * maxValue) + 1; + } + return arr; + } + + // 为了测试 + public static void printArray(int[] arr) { + for (int i = 0; i < arr.length; i++) { + System.out.print(arr[i] + " "); + } + System.out.println(); + } + + // 为了测试 + public static void main(String[] args) { + int maxLen = 20; + int maxValue = 30; + int testTime = 1000000; + System.out.println("测试开始"); + for (int i = 0; i < testTime; i++) { + int[] arr = randomArray(maxLen, maxValue); + int aim = (int) (Math.random() * maxValue); + int ans1 = coinWays(arr, aim); + int ans2 = dp(arr, aim); + if (ans1 != ans2) { + System.out.println("Oops!"); + printArray(arr); + System.out.println(aim); + System.out.println(ans1); + System.out.println(ans2); + break; + } + } + System.out.println("测试结束"); + } + +} diff --git a/src/class20/Code02_CoinsWayNoLimit.java b/src/class20/Code02_CoinsWayNoLimit.java new file mode 100644 index 0000000..95dd573 --- /dev/null +++ b/src/class20/Code02_CoinsWayNoLimit.java @@ -0,0 +1,107 @@ +package class20; + +public class Code02_CoinsWayNoLimit { + + public static int coinsWay(int[] arr, int aim) { + if (arr == null || arr.length == 0 || aim < 0) { + return 0; + } + return process(arr, 0, aim); + } + + public static int process(int[] arr, int index, int rest) { + if (index == arr.length) { + return rest == 0 ? 1 : 0; + } + int ways = 0; + for (int zhang = 0; zhang * arr[index] <= rest; zhang++) { + ways += process(arr, index + 1, rest - (zhang * arr[index])); + } + return ways; + } + + public static int dp1(int[] arr, int aim) { + if (arr == null || arr.length == 0 || aim < 0) { + return 0; + } + int N = arr.length; + int[][] dp = new int[N + 1][aim + 1]; + dp[N][0] = 1; + for (int index = N - 1; index >= 0; index--) { + for (int rest = 0; rest <= aim; rest++) { + int ways = 0; + for (int zhang = 0; zhang * arr[index] <= rest; zhang++) { + ways += dp[index + 1][rest - (zhang * arr[index])]; + } + dp[index][rest] = ways; + } + } + return dp[0][aim]; + } + + public static int dp2(int[] arr, int aim) { + if (arr == null || arr.length == 0 || aim < 0) { + return 0; + } + int N = arr.length; + int[][] dp = new int[N + 1][aim + 1]; + dp[N][0] = 1; + for (int index = N - 1; index >= 0; index--) { + for (int rest = 0; rest <= aim; rest++) { + dp[index][rest] = dp[index + 1][rest]; + if (rest - arr[index] >= 0) { + dp[index][rest] += dp[index][rest - arr[index]]; + } + } + } + return dp[0][aim]; + } + + // 为了测试 + public static int[] randomArray(int maxLen, int maxValue) { + int N = (int) (Math.random() * maxLen); + int[] arr = new int[N]; + boolean[] has = new boolean[maxValue + 1]; + for (int i = 0; i < N; i++) { + do { + arr[i] = (int) (Math.random() * maxValue) + 1; + } while (has[arr[i]]); + has[arr[i]] = true; + } + return arr; + } + + // 为了测试 + public static void printArray(int[] arr) { + for (int i = 0; i < arr.length; i++) { + System.out.print(arr[i] + " "); + } + System.out.println(); + } + + // 为了测试 + public static void main(String[] args) { + int maxLen = 10; + int maxValue = 30; + int testTime = 1000000; + System.out.println("测试开始"); + for (int i = 0; i < testTime; i++) { + int[] arr = randomArray(maxLen, maxValue); + int aim = (int) (Math.random() * maxValue); + int ans1 = coinsWay(arr, aim); + int ans2 = dp1(arr, aim); + int ans3 = dp2(arr, aim); + if (ans1 != ans2 || ans1 != ans3) { + System.out.println("Oops!"); + printArray(arr); + System.out.println(aim); + System.out.println(ans1); + System.out.println(ans2); + System.out.println(ans3); + break; + } + } + System.out.println("测试结束"); + } + +} diff --git a/src/class20/Code03_CoinsWaySameValueSamePapper.java b/src/class20/Code03_CoinsWaySameValueSamePapper.java new file mode 100644 index 0000000..357fb37 --- /dev/null +++ b/src/class20/Code03_CoinsWaySameValueSamePapper.java @@ -0,0 +1,146 @@ +package class20; + +import java.util.HashMap; +import java.util.Map.Entry; + +public class Code03_CoinsWaySameValueSamePapper { + + public static class Info { + public int[] coins; + public int[] zhangs; + + public Info(int[] c, int[] z) { + coins = c; + zhangs = z; + } + } + + public static Info getInfo(int[] arr) { + HashMap counts = new HashMap<>(); + for (int value : arr) { + if (!counts.containsKey(value)) { + counts.put(value, 1); + } else { + counts.put(value, counts.get(value) + 1); + } + } + int N = counts.size(); + int[] coins = new int[N]; + int[] zhangs = new int[N]; + int index = 0; + for (Entry entry : counts.entrySet()) { + coins[index] = entry.getKey(); + zhangs[index++] = entry.getValue(); + } + return new Info(coins, zhangs); + } + + public static int coinsWay(int[] arr, int aim) { + if (arr == null || arr.length == 0 || aim < 0) { + return 0; + } + Info info = getInfo(arr); + return process(info.coins, info.zhangs, 0, aim); + } + + public static int process(int[] coins, int[] zhangs, int index, int rest) { + if (index == coins.length) { + return rest == 0 ? 1 : 0; + } + int ways = 0; + for (int zhang = 0; zhang * coins[index] <= rest && zhang <= zhangs[index]; zhang++) { + ways += process(coins, zhangs, index + 1, rest - (zhang * coins[index])); + } + return ways; + } + + public static int dp1(int[] arr, int aim) { + if (arr == null || arr.length == 0 || aim < 0) { + return 0; + } + Info info = getInfo(arr); + int[] coins = info.coins; + int[] zhangs = info.zhangs; + int N = coins.length; + int[][] dp = new int[N + 1][aim + 1]; + dp[N][0] = 1; + for (int index = N - 1; index >= 0; index--) { + for (int rest = 0; rest <= aim; rest++) { + int ways = 0; + for (int zhang = 0; zhang * coins[index] <= rest && zhang <= zhangs[index]; zhang++) { + ways += dp[index + 1][rest - (zhang * coins[index])]; + } + dp[index][rest] = ways; + } + } + return dp[0][aim]; + } + + public static int dp2(int[] arr, int aim) { + if (arr == null || arr.length == 0 || aim < 0) { + return 0; + } + Info info = getInfo(arr); + int[] coins = info.coins; + int[] zhangs = info.zhangs; + int N = coins.length; + int[][] dp = new int[N + 1][aim + 1]; + dp[N][0] = 1; + for (int index = N - 1; index >= 0; index--) { + for (int rest = 0; rest <= aim; rest++) { + dp[index][rest] = dp[index + 1][rest]; + if (rest - coins[index] >= 0) { + dp[index][rest] += dp[index][rest - coins[index]]; + } + if (rest - coins[index] * (zhangs[index] + 1) >= 0) { + dp[index][rest] -= dp[index + 1][rest - coins[index] * (zhangs[index] + 1)]; + } + } + } + return dp[0][aim]; + } + + // 为了测试 + public static int[] randomArray(int maxLen, int maxValue) { + int N = (int) (Math.random() * maxLen); + int[] arr = new int[N]; + for (int i = 0; i < N; i++) { + arr[i] = (int) (Math.random() * maxValue) + 1; + } + return arr; + } + + // 为了测试 + public static void printArray(int[] arr) { + for (int i = 0; i < arr.length; i++) { + System.out.print(arr[i] + " "); + } + System.out.println(); + } + + // 为了测试 + public static void main(String[] args) { + int maxLen = 10; + int maxValue = 20; + int testTime = 1000000; + System.out.println("测试开始"); + for (int i = 0; i < testTime; i++) { + int[] arr = randomArray(maxLen, maxValue); + int aim = (int) (Math.random() * maxValue); + int ans1 = coinsWay(arr, aim); + int ans2 = dp1(arr, aim); + int ans3 = dp2(arr, aim); + if (ans1 != ans2 || ans1 != ans3) { + System.out.println("Oops!"); + printArray(arr); + System.out.println(aim); + System.out.println(ans1); + System.out.println(ans2); + System.out.println(ans3); + break; + } + } + System.out.println("测试结束"); + } + +} diff --git a/src/class20/Code04_MinCoinsOnePaper.java b/src/class20/Code04_MinCoinsOnePaper.java new file mode 100644 index 0000000..02e48a1 --- /dev/null +++ b/src/class20/Code04_MinCoinsOnePaper.java @@ -0,0 +1,250 @@ +package class20; + +import java.util.HashMap; +import java.util.Map.Entry; +import java.util.LinkedList; + +public class Code04_MinCoinsOnePaper { + + public static int minCoins(int[] arr, int aim) { + return process(arr, 0, aim); + } + + public static int process(int[] arr, int index, int rest) { + if (rest < 0) { + return Integer.MAX_VALUE; + } + if (index == arr.length) { + return rest == 0 ? 0 : Integer.MAX_VALUE; + } else { + int p1 = process(arr, index + 1, rest); + int p2 = process(arr, index + 1, rest - arr[index]); + if (p2 != Integer.MAX_VALUE) { + p2++; + } + return Math.min(p1, p2); + } + } + + // dp1时间复杂度为:O(arr长度 * aim) + public static int dp1(int[] arr, int aim) { + if (aim == 0) { + return 0; + } + int N = arr.length; + int[][] dp = new int[N + 1][aim + 1]; + dp[N][0] = 0; + for (int j = 1; j <= aim; j++) { + dp[N][j] = Integer.MAX_VALUE; + } + for (int index = N - 1; index >= 0; index--) { + for (int rest = 0; rest <= aim; rest++) { + int p1 = dp[index + 1][rest]; + int p2 = rest - arr[index] >= 0 ? dp[index + 1][rest - arr[index]] : Integer.MAX_VALUE; + if (p2 != Integer.MAX_VALUE) { + p2++; + } + dp[index][rest] = Math.min(p1, p2); + } + } + return dp[0][aim]; + } + + public static class Info { + public int[] coins; + public int[] zhangs; + + public Info(int[] c, int[] z) { + coins = c; + zhangs = z; + } + } + + public static Info getInfo(int[] arr) { + HashMap counts = new HashMap<>(); + for (int value : arr) { + if (!counts.containsKey(value)) { + counts.put(value, 1); + } else { + counts.put(value, counts.get(value) + 1); + } + } + int N = counts.size(); + int[] coins = new int[N]; + int[] zhangs = new int[N]; + int index = 0; + for (Entry entry : counts.entrySet()) { + coins[index] = entry.getKey(); + zhangs[index++] = entry.getValue(); + } + return new Info(coins, zhangs); + } + + // dp2时间复杂度为:O(arr长度) + O(货币种数 * aim * 每种货币的平均张数) + public static int dp2(int[] arr, int aim) { + if (aim == 0) { + return 0; + } + // 得到info时间复杂度O(arr长度) + Info info = getInfo(arr); + int[] coins = info.coins; + int[] zhangs = info.zhangs; + int N = coins.length; + int[][] dp = new int[N + 1][aim + 1]; + dp[N][0] = 0; + for (int j = 1; j <= aim; j++) { + dp[N][j] = Integer.MAX_VALUE; + } + // 这三层for循环,时间复杂度为O(货币种数 * aim * 每种货币的平均张数) + for (int index = N - 1; index >= 0; index--) { + for (int rest = 0; rest <= aim; rest++) { + dp[index][rest] = dp[index + 1][rest]; + for (int zhang = 1; zhang * coins[index] <= aim && zhang <= zhangs[index]; zhang++) { + if (rest - zhang * coins[index] >= 0 + && dp[index + 1][rest - zhang * coins[index]] != Integer.MAX_VALUE) { + dp[index][rest] = Math.min(dp[index][rest], zhang + dp[index + 1][rest - zhang * coins[index]]); + } + } + } + } + return dp[0][aim]; + } + + // 这种解法课上不讲 + // 因为需要理解窗口内最小值的更新结构 + // 后面的课会讲 + // dp3时间复杂度为:O(arr长度) + O(货币种数 * aim) + public static int dp3(int[] arr, int aim) { + if (aim == 0) { + return 0; + } + // 得到info时间复杂度O(arr长度) + Info info = getInfo(arr); + int[] c = info.coins; + int[] z = info.zhangs; + int N = c.length; + int[][] dp = new int[N + 1][aim + 1]; + dp[N][0] = 0; + for (int j = 1; j <= aim; j++) { + dp[N][j] = Integer.MAX_VALUE; + } + // 虽然是嵌套了很多循环,但是时间复杂度为O(货币种数 * aim) + // 因为用了窗口内最小值的更新结构 + for (int i = N - 1; i >= 0; i--) { + for (int mod = 0; mod < Math.min(aim + 1, c[i]); mod++) { + LinkedList w = new LinkedList<>(); + w.add(mod); + dp[i][mod] = dp[i + 1][mod]; + for (int r = mod + c[i]; r <= aim; r += c[i]) { + while (!w.isEmpty() && (dp[i + 1][w.peekLast()] == Integer.MAX_VALUE + || dp[i + 1][w.peekLast()] + compensate(w.peekLast(), r, c[i]) >= dp[i + 1][r])) { + w.pollLast(); + } + w.addLast(r); + int overdue = r - c[i] * (z[i] + 1); + if (w.peekFirst() == overdue) { + w.pollFirst(); + } + dp[i][r] = dp[i + 1][w.peekFirst()] + compensate(w.peekFirst(), r, c[i]); + } + } + } + return dp[0][aim]; + } + + public static int compensate(int pre, int cur, int coin) { + return (cur - pre) / coin; + } + + // 为了测试 + public static int[] randomArray(int N, int maxValue) { + int[] arr = new int[N]; + for (int i = 0; i < N; i++) { + arr[i] = (int) (Math.random() * maxValue) + 1; + } + return arr; + } + + // 为了测试 + public static void printArray(int[] arr) { + for (int i = 0; i < arr.length; i++) { + System.out.print(arr[i] + " "); + } + System.out.println(); + } + + // 为了测试 + public static void main(String[] args) { + int maxLen = 20; + int maxValue = 30; + int testTime = 300000; + System.out.println("功能测试开始"); + for (int i = 0; i < testTime; i++) { + int N = (int) (Math.random() * maxLen); + int[] arr = randomArray(N, maxValue); + int aim = (int) (Math.random() * maxValue); + int ans1 = minCoins(arr, aim); + int ans2 = dp1(arr, aim); + int ans3 = dp2(arr, aim); + int ans4 = dp3(arr, aim); + if (ans1 != ans2 || ans3 != ans4 || ans1 != ans3) { + System.out.println("Oops!"); + printArray(arr); + System.out.println(aim); + System.out.println(ans1); + System.out.println(ans2); + System.out.println(ans3); + System.out.println(ans4); + break; + } + } + System.out.println("功能测试结束"); + + System.out.println("=========="); + + int aim = 0; + int[] arr = null; + long start; + long end; + int ans2; + int ans3; + + System.out.println("性能测试开始"); + maxLen = 30000; + maxValue = 20; + aim = 60000; + arr = randomArray(maxLen, maxValue); + + start = System.currentTimeMillis(); + ans2 = dp2(arr, aim); + end = System.currentTimeMillis(); + System.out.println("dp2答案 : " + ans2 + ", dp2运行时间 : " + (end - start) + " ms"); + + start = System.currentTimeMillis(); + ans3 = dp3(arr, aim); + end = System.currentTimeMillis(); + System.out.println("dp3答案 : " + ans3 + ", dp3运行时间 : " + (end - start) + " ms"); + System.out.println("性能测试结束"); + + System.out.println("==========="); + + System.out.println("货币大量重复出现情况下,"); + System.out.println("大数据量测试dp3开始"); + maxLen = 20000000; + aim = 10000; + maxValue = 10000; + arr = randomArray(maxLen, maxValue); + start = System.currentTimeMillis(); + ans3 = dp3(arr, aim); + end = System.currentTimeMillis(); + System.out.println("dp3运行时间 : " + (end - start) + " ms"); + System.out.println("大数据量测试dp3结束"); + + System.out.println("==========="); + + System.out.println("当货币很少出现重复,dp2比dp3有常数时间优势"); + System.out.println("当货币大量出现重复,dp3时间复杂度明显优于dp2"); + System.out.println("dp3的讲解放在窗口内最大值或最小值的更新结构里"); + } + +} diff --git a/src/class20/Code05_MinCoinsNoLimit.java b/src/class20/Code05_MinCoinsNoLimit.java new file mode 100644 index 0000000..b41ad45 --- /dev/null +++ b/src/class20/Code05_MinCoinsNoLimit.java @@ -0,0 +1,93 @@ +package class20; + +public class Code05_MinCoinsNoLimit { + + public static int minCoins(int[] arr, int aim) { + return process(arr, 0, aim); + } + + public static int process(int[] arr, int index, int rest) { + if (rest < 0) { + return Integer.MAX_VALUE; + } + if (index == arr.length) { + return rest == 0 ? 0 : Integer.MAX_VALUE; + } else { + int ans = Integer.MAX_VALUE; + for (int zhang = 0; zhang * arr[index] <= rest; zhang++) { + int next = process(arr, index + 1, rest - zhang * arr[index]); + if (next != Integer.MAX_VALUE) { + ans = Math.min(ans, next + zhang); + } + } + return ans; + } + } + + public static int dp(int[] arr, int aim) { + if (aim == 0) { + return 0; + } + int N = arr.length; + int[][] dp = new int[N + 1][aim + 1]; + dp[N][0] = 0; + for (int j = 1; j <= aim; j++) { + dp[N][j] = Integer.MAX_VALUE; + } + for (int index = N - 1; index >= 0; index--) { + for (int rest = 0; rest <= aim; rest++) { + dp[index][rest] = dp[index + 1][rest]; + if (rest - arr[index] >= 0 && dp[index][rest - arr[index]] != Integer.MAX_VALUE) + dp[index][rest] = Math.min(dp[index][rest], dp[index][rest - arr[index]] + 1); + } + } + return dp[0][aim]; + } + + // 为了测试 + public static int[] randomArray(int maxLen, int maxValue) { + int N = (int) (Math.random() * maxLen); + int[] arr = new int[N]; + boolean[] has = new boolean[maxValue + 1]; + for (int i = 0; i < N; i++) { + do { + arr[i] = (int) (Math.random() * maxValue) + 1; + } while (has[arr[i]]); + has[arr[i]] = true; + } + return arr; + } + + // 为了测试 + public static void printArray(int[] arr) { + for (int i = 0; i < arr.length; i++) { + System.out.print(arr[i] + " "); + } + System.out.println(); + } + + // 为了测试 + public static void main(String[] args) { + int maxLen = 20; + int maxValue = 30; + int testTime = 300000; + System.out.println("功能测试开始"); + for (int i = 0; i < testTime; i++) { + int N = (int) (Math.random() * maxLen); + int[] arr = randomArray(N, maxValue); + int aim = (int) (Math.random() * maxValue); + int ans1 = minCoins(arr, aim); + int ans2 = dp(arr, aim); + if (ans1 != ans2) { + System.out.println("Oops!"); + printArray(arr); + System.out.println(aim); + System.out.println(ans1); + System.out.println(ans2); + break; + } + } + System.out.println("功能测试结束"); + } + +} diff --git a/src/class21/Code01_BobDie.java b/src/class21/Code01_BobDie.java new file mode 100644 index 0000000..211be20 --- /dev/null +++ b/src/class21/Code01_BobDie.java @@ -0,0 +1,55 @@ +package class21; + +public class Code01_BobDie { + + public static double livePosibility1(int row, int col, int k, int N, int M) { + return (double) process(row, col, k, N, M) / Math.pow(4, k); + } + + public static long process(int row, int col, int rest, int N, int M) { + if (row < 0 || row == N || col < 0 || col == M) { + return 0; + } + if (rest == 0) { + return 1; + } + long up = process(row - 1, col, rest - 1, N, M); + long down = process(row + 1, col, rest - 1, N, M); + long left = process(row, col - 1, rest - 1, N, M); + long right = process(row, col + 1, rest - 1, N, M); + return up + down + left + right; + } + + public static double livePosibility2(int row, int col, int k, int N, int M) { + long[][][] dp = new long[N][M][k + 1]; + for (int i = 0; i < N; i++) { + for (int j = 0; j < M; j++) { + dp[i][j][0] = 1; + } + } + for (int rest = 1; rest <= k; rest++) { + for (int r = 0; r < N; r++) { + for (int c = 0; c < M; c++) { + dp[r][c][rest] = pick(dp, N, M, r - 1, c, rest - 1); + dp[r][c][rest] += pick(dp, N, M, r + 1, c, rest - 1); + dp[r][c][rest] += pick(dp, N, M, r, c - 1, rest - 1); + dp[r][c][rest] += pick(dp, N, M, r, c + 1, rest - 1); + } + } + } + return (double) dp[row][col][k] / Math.pow(4, k); + } + + public static long pick(long[][][] dp, int N, int M, int r, int c, int rest) { + if (r < 0 || r == N || c < 0 || c == M) { + return 0; + } + return dp[r][c][rest]; + } + + public static void main(String[] args) { + System.out.println(livePosibility1(6, 6, 10, 50, 50)); + System.out.println(livePosibility2(6, 6, 10, 50, 50)); + } + +} diff --git a/src/class21/Code02_KillMonster.java b/src/class21/Code02_KillMonster.java new file mode 100644 index 0000000..fbc2871 --- /dev/null +++ b/src/class21/Code02_KillMonster.java @@ -0,0 +1,94 @@ +package class21; + +public class Code02_KillMonster { + + public static double right1(int N, int M, int K) { + if (N < 1 || M < 1 || K < 1) { + return 0; + } + long all = (long) Math.pow(M + 1, K); + long kill = process1(N, M, K); + return (double) ((double) kill / (double) all); + } + + public static long process1(int N, int M, int K) { + if (K == 0) { + return N <= 0 ? 1 : 0; + } + long ways = 0; + for (int i = 0; i <= M; i++) { + ways += process1(N - i, M, K - 1); + } + return ways; + } + + public static double right2(int N, int M, int K) { + if (N < 1 || M < 1 || K < 1) { + return 0; + } + long all = (long) Math.pow(M + 1, K); + long kill = process2(N, M, K); + return (double) ((double) kill / (double) all); + } + + public static long process2(int N, int M, int K) { + if (K == 0) { + return N <= 0 ? 1 : 0; + } + if (N <= 0) { + return (long) (Math.pow(M + 1, K)); + } + return process2(N, M, K - 1) + process2(N - 1, M, K) - process2(N - M - 1, M, K - 1); + } + + // M = 5 + // 以下为斜率优化改进枚举行为的动态规划 + // dp[8][5] = dp[8..3][4] + // dp[9][5] = dp[9..4][4] = dp[9][4] + dp[8][5] - dp[3][4] + // 可以推出 + // dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i - M - 1][j-1] + public static double dp(int N, int M, int K) { + if (N < 1 || M < 1 || K < 1) { + return 0; + } + long[][] dp = new long[N + 1][K + 1]; + // 特别注意:dp[0][j]既表示原含义,也表示M+1的j次方的值 + dp[0][0] = 1; + for (int j = 1; j <= K; j++) { + dp[0][j] = dp[0][j - 1] * (M + 1); + } + for (int j = 1; j <= K; j++) { + for (int i = 1; i <= N; i++) { + dp[i][j] = dp[i][j - 1] + dp[i - 1][j]; + if (i - M - 1 < 0) { + dp[i][j] -= dp[0][j - 1]; + } else { + dp[i][j] -= dp[i - M - 1][j - 1]; + } + } + } + return (double) ((double) dp[N][K] / (double) dp[0][K]); + } + + public static void main(String[] args) { + int NMax = 10; + int MMax = 10; + int KMax = 10; + int testTime = 200; + System.out.println("测试开始"); + for (int i = 0; i < testTime; i++) { + int N = (int) (Math.random() * NMax); + int M = (int) (Math.random() * MMax); + int K = (int) (Math.random() * KMax); + double ans1 = right1(N, M, K); + double ans2 = right2(N, M, K); + double ans3 = dp(N, M, K); + if (ans1 != ans2 || ans1 != ans3) { + System.out.println("Oops!"); + break; + } + } + System.out.println("测试结束"); + } + +} diff --git a/src/class12/Code10_SplitSumClosed.java b/src/class21/Code03_SplitSumClosed.java similarity index 80% rename from src/class12/Code10_SplitSumClosed.java rename to src/class21/Code03_SplitSumClosed.java index d12b567..c9bb573 100644 --- a/src/class12/Code10_SplitSumClosed.java +++ b/src/class21/Code03_SplitSumClosed.java @@ -1,14 +1,8 @@ -package class12; +package class21; import java.util.TreeSet; -/* - * 给定一个整型数组arr,请把arr中所有的数分成两个集合,尽量让两个集合的累加和接近 - * 返回最接近的情况下,较小集合的累加和(较大集合的累加和一定是所有数累加和减去较小集合的累加和) - * 为了方便起见,假设arr中没有负数,其实也可以有 - * 但是处理起来会比较麻烦,而且有没有负数都不影响算法流程的理解 - * */ -public class Code10_SplitSumClosed { +public class Code03_SplitSumClosed { public static int right(int[] arr) { if (arr == null || arr.length < 2) { diff --git a/src/class12/Code11_SplitSumClosedSizeHalf.java b/src/class21/Code04_SplitSumClosedSizeHalf.java similarity index 79% rename from src/class12/Code11_SplitSumClosedSizeHalf.java rename to src/class21/Code04_SplitSumClosedSizeHalf.java index bf2c28b..bdfffff 100644 --- a/src/class12/Code11_SplitSumClosedSizeHalf.java +++ b/src/class21/Code04_SplitSumClosedSizeHalf.java @@ -1,17 +1,8 @@ -package class12; +package class21; import java.util.TreeSet; -/* - * 给定一个整型数组arr,请把arr中所有的数分成两个集合 - * 如果arr长度为偶数,两个集合包含数的个数要一样多 - * 如果arr长度为奇数,两个集合包含数的个数必须只差一个 - * 请尽量让两个集合的累加和接近 - * 返回最接近的情况下,较小集合的累加和(较大集合的累加和一定是所有数累加和减去较小集合的累加和) - * 为了方便起见,假设arr中没有负数,其实也可以有 - * 但是处理起来会比较麻烦,而且有没有负数都不影响算法流程的理解 - * */ -public class Code11_SplitSumClosedSizeHalf { +public class Code04_SplitSumClosedSizeHalf { public static int right(int[] arr) { if (arr == null || arr.length < 2) { diff --git a/src/class11_17/Code09_NQueens.java b/src/class21/Code05_NQueens.java similarity index 50% rename from src/class11_17/Code09_NQueens.java rename to src/class21/Code05_NQueens.java index 05da2b6..de49c7a 100644 --- a/src/class11_17/Code09_NQueens.java +++ b/src/class21/Code05_NQueens.java @@ -1,31 +1,21 @@ -package class11_17; +package class21; -public class Code09_NQueens { +public class Code05_NQueens { public static int num1(int n) { if (n < 1) { return 0; } - // record[0] ? record[1] ? record[2] - int[] record = new int[n]; // record[i] -> i行的皇后,放在了第几列 + int[] record = new int[n]; return process1(0, record, n); } - // 潜台词:record[0..i-1]的皇后,任何两个皇后一定都不共行、不共列,不共斜线 - // 目前来到了第i行 - // record[0..i-1]表示之前的行,放了的皇后位置 - // n代表整体一共有多少行 0~n-1行 - // 返回值是,摆完所有的皇后,合理的摆法有多少种 public static int process1(int i, int[] record, int n) { - if (i == n) { // 终止行 + if (i == n) { return 1; } - // 没有到终止位置,还有皇后要摆 int res = 0; - for (int j = 0; j < n; j++) { // 当前行在i行,尝试i行所有的列 -> j - // 当前i行的皇后,放在j列,会不会和之前(0..i-1)的皇后,不共行共列或者共斜线, - // 如果是,认为有效 - // 如果不是,认为无效 + for (int j = 0; j < n; j++) { if (isValid(record, i, j)) { record[i] = j; res += process1(i + 1, record, n); @@ -34,11 +24,8 @@ public class Code09_NQueens { return res; } - // record[0..i-1]你需要看,record[i...]不需要看 - // 返回i行皇后,放在了j列,是否有效 public static boolean isValid(int[] record, int i, int j) { - for (int k = 0; k < i; k++) { // 之前的某个k行的皇后 - // k, record[k] i, j + for (int k = 0; k < i; k++) { if (j == record[k] || Math.abs(record[k] - j) == Math.abs(i - k)) { return false; } @@ -56,27 +43,18 @@ public class Code09_NQueens { return process2(limit, 0, 0, 0); } - // limit 划定了问题的规模 -> 固定 - - // colLim 列的限制,1的位置不能放皇后,0的位置可以 - // leftDiaLim 左斜线的限制,1的位置不能放皇后,0的位置可以 - // rightDiaLim 右斜线的限制,1的位置不能放皇后,0的位置可以 public static int process2( int limit, int colLim, int leftDiaLim, int rightDiaLim) { - if (colLim == limit) { // base case + if (colLim == limit) { return 1; } - // 所有可以放皇后的位置,都在pos上 - // colLim | leftDiaLim | rightDiaLim -> 总限制 - // ~ (colLim | leftDiaLim | rightDiaLim) -> 左侧的一坨0干扰,右侧每个1,可尝试 int pos = limit & ( ~(colLim | leftDiaLim | rightDiaLim) ); int mostRightOne = 0; int res = 0; while (pos != 0) { - // 其取出pos中,最右侧的1来,剩下位置都是0 mostRightOne = pos & (~pos + 1); pos = pos - mostRightOne; res += process2(limit,