diff --git a/.gradle/4.1/fileChanges/last-build.bin b/.gradle/4.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd23..0000000 Binary files a/.gradle/4.1/fileChanges/last-build.bin and /dev/null differ diff --git a/.gradle/4.1/fileContent/fileContent.lock b/.gradle/4.1/fileContent/fileContent.lock deleted file mode 100644 index 2b3660f..0000000 Binary files a/.gradle/4.1/fileContent/fileContent.lock and /dev/null differ diff --git a/.gradle/4.1/fileHashes/fileHashes.bin b/.gradle/4.1/fileHashes/fileHashes.bin deleted file mode 100644 index 95cbb8a..0000000 Binary files a/.gradle/4.1/fileHashes/fileHashes.bin and /dev/null differ diff --git a/.gradle/4.1/fileHashes/fileHashes.lock b/.gradle/4.1/fileHashes/fileHashes.lock deleted file mode 100644 index 949f555..0000000 Binary files a/.gradle/4.1/fileHashes/fileHashes.lock and /dev/null differ diff --git a/.gradle/4.1/fileHashes/resourceHashesCache.bin b/.gradle/4.1/fileHashes/resourceHashesCache.bin deleted file mode 100644 index f2a1737..0000000 Binary files a/.gradle/4.1/fileHashes/resourceHashesCache.bin and /dev/null differ diff --git a/.gradle/4.1/javaCompile/classAnalysis.bin b/.gradle/4.1/javaCompile/classAnalysis.bin deleted file mode 100644 index 3371203..0000000 Binary files a/.gradle/4.1/javaCompile/classAnalysis.bin and /dev/null differ diff --git a/.gradle/4.1/javaCompile/jarAnalysis.bin b/.gradle/4.1/javaCompile/jarAnalysis.bin deleted file mode 100644 index a56b5db..0000000 Binary files a/.gradle/4.1/javaCompile/jarAnalysis.bin and /dev/null differ diff --git a/.gradle/4.1/javaCompile/javaCompile.lock b/.gradle/4.1/javaCompile/javaCompile.lock deleted file mode 100644 index 04089de..0000000 Binary files a/.gradle/4.1/javaCompile/javaCompile.lock and /dev/null differ diff --git a/.gradle/4.1/javaCompile/taskHistory.bin b/.gradle/4.1/javaCompile/taskHistory.bin deleted file mode 100644 index 53de73f..0000000 Binary files a/.gradle/4.1/javaCompile/taskHistory.bin and /dev/null differ diff --git a/.gradle/4.1/javaCompile/taskJars.bin b/.gradle/4.1/javaCompile/taskJars.bin deleted file mode 100644 index 5020792..0000000 Binary files a/.gradle/4.1/javaCompile/taskJars.bin and /dev/null differ diff --git a/.gradle/4.1/taskHistory/fileSnapshots.bin b/.gradle/4.1/taskHistory/fileSnapshots.bin deleted file mode 100644 index a03467d..0000000 Binary files a/.gradle/4.1/taskHistory/fileSnapshots.bin and /dev/null differ diff --git a/.gradle/4.1/taskHistory/taskHistory.bin b/.gradle/4.1/taskHistory/taskHistory.bin deleted file mode 100644 index c333e10..0000000 Binary files a/.gradle/4.1/taskHistory/taskHistory.bin and /dev/null differ diff --git a/.gradle/4.1/taskHistory/taskHistory.lock b/.gradle/4.1/taskHistory/taskHistory.lock deleted file mode 100644 index a400fe8..0000000 Binary files a/.gradle/4.1/taskHistory/taskHistory.lock and /dev/null differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index c17f25c..0000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Tue May 07 16:16:07 CST 2019 -gradle.version=4.4 diff --git a/.idea/DataStructure.iml b/.idea/DataStructure.iml deleted file mode 100644 index dc1d2f2..0000000 --- a/.idea/DataStructure.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser deleted file mode 100644 index b67beb6..0000000 Binary files a/.idea/caches/build_file_checksums.ser and /dev/null differ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 30aa626..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 1783ac1..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml b/.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml deleted file mode 100644 index 59fed49..0000000 --- a/.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_core_runtime_1_1_0_aar.xml b/.idea/libraries/Gradle__android_arch_core_runtime_1_1_0_aar.xml deleted file mode 100644 index 485fa39..0000000 --- a/.idea/libraries/Gradle__android_arch_core_runtime_1_1_0_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml b/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml deleted file mode 100644 index ffc788c..0000000 --- a/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0_aar.xml b/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0_aar.xml deleted file mode 100644 index 97a4a3f..0000000 --- a/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0_aar.xml b/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0_aar.xml deleted file mode 100644 index ef71b7c..0000000 --- a/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0_aar.xml b/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0_aar.xml deleted file mode 100644 index 0a6e645..0000000 --- a/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_23_4_0_aar.xml b/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_23_4_0_aar.xml deleted file mode 100644 index d4fa9c5..0000000 --- a/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_23_4_0_aar.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_28_0_0_alpha1_aar.xml deleted file mode 100644 index 3917225..0000000 --- a/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_appcompat_v7_23_4_0_aar.xml b/.idea/libraries/Gradle__com_android_support_appcompat_v7_23_4_0_aar.xml deleted file mode 100644 index 4fe18a6..0000000 --- a/.idea/libraries/Gradle__com_android_support_appcompat_v7_23_4_0_aar.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_appcompat_v7_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_appcompat_v7_28_0_0_alpha1_aar.xml deleted file mode 100644 index 8e0c74a..0000000 --- a/.idea/libraries/Gradle__com_android_support_appcompat_v7_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_asynclayoutinflater_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_asynclayoutinflater_28_0_0_alpha1_aar.xml deleted file mode 100644 index a57317e..0000000 --- a/.idea/libraries/Gradle__com_android_support_asynclayoutinflater_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_cardview_v7_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_cardview_v7_28_0_0_alpha1_aar.xml deleted file mode 100644 index 86816c1..0000000 --- a/.idea/libraries/Gradle__com_android_support_cardview_v7_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_collections_28_0_0_alpha1_jar.xml b/.idea/libraries/Gradle__com_android_support_collections_28_0_0_alpha1_jar.xml deleted file mode 100644 index a64bf75..0000000 --- a/.idea/libraries/Gradle__com_android_support_collections_28_0_0_alpha1_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_constraint_constraint_layout_1_0_2_aar.xml b/.idea/libraries/Gradle__com_android_support_constraint_constraint_layout_1_0_2_aar.xml deleted file mode 100644 index 952eafe..0000000 --- a/.idea/libraries/Gradle__com_android_support_constraint_constraint_layout_1_0_2_aar.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_constraint_constraint_layout_solver_1_0_2_jar.xml b/.idea/libraries/Gradle__com_android_support_constraint_constraint_layout_solver_1_0_2_jar.xml deleted file mode 100644 index b5bafe9..0000000 --- a/.idea/libraries/Gradle__com_android_support_constraint_constraint_layout_solver_1_0_2_jar.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_coordinatorlayout_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_coordinatorlayout_28_0_0_alpha1_aar.xml deleted file mode 100644 index fda0f90..0000000 --- a/.idea/libraries/Gradle__com_android_support_coordinatorlayout_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_cursoradapter_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_cursoradapter_28_0_0_alpha1_aar.xml deleted file mode 100644 index af3ec3a..0000000 --- a/.idea/libraries/Gradle__com_android_support_cursoradapter_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_customview_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_customview_28_0_0_alpha1_aar.xml deleted file mode 100644 index 9de1db1..0000000 --- a/.idea/libraries/Gradle__com_android_support_customview_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_28_0_0_alpha1_aar.xml deleted file mode 100644 index 27df643..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_animation_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_animation_28_0_0_alpha1_aar.xml deleted file mode 100644 index f09c49b..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_animation_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_bottomappbar_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_bottomappbar_28_0_0_alpha1_aar.xml deleted file mode 100644 index f12471c..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_bottomappbar_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_bottomnavigation_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_bottomnavigation_28_0_0_alpha1_aar.xml deleted file mode 100644 index 1c4f8e1..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_bottomnavigation_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_bottomsheet_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_bottomsheet_28_0_0_alpha1_aar.xml deleted file mode 100644 index 95d3f2c..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_bottomsheet_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_button_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_button_28_0_0_alpha1_aar.xml deleted file mode 100644 index 98586fb..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_button_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_canvas_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_canvas_28_0_0_alpha1_aar.xml deleted file mode 100644 index 313645b..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_canvas_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_card_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_card_28_0_0_alpha1_aar.xml deleted file mode 100644 index 651f612..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_card_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_chip_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_chip_28_0_0_alpha1_aar.xml deleted file mode 100644 index 3f1eac5..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_chip_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_circularreveal_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_circularreveal_28_0_0_alpha1_aar.xml deleted file mode 100644 index 24e44ee..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_circularreveal_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_circularreveal_cardview_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_circularreveal_cardview_28_0_0_alpha1_aar.xml deleted file mode 100644 index b1a1d8f..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_circularreveal_cardview_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_circularreveal_coordinatorlayout_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_circularreveal_coordinatorlayout_28_0_0_alpha1_aar.xml deleted file mode 100644 index 9a58dae..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_circularreveal_coordinatorlayout_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_color_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_color_28_0_0_alpha1_aar.xml deleted file mode 100644 index 5cda27f..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_color_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_dialog_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_dialog_28_0_0_alpha1_aar.xml deleted file mode 100644 index a7dffaa..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_dialog_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_drawable_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_drawable_28_0_0_alpha1_aar.xml deleted file mode 100644 index 2594daf..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_drawable_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_expandable_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_expandable_28_0_0_alpha1_aar.xml deleted file mode 100644 index d6dc890..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_expandable_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_floatingactionbutton_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_floatingactionbutton_28_0_0_alpha1_aar.xml deleted file mode 100644 index a175b24..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_floatingactionbutton_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_internal_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_internal_28_0_0_alpha1_aar.xml deleted file mode 100644 index 0d56144..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_internal_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_math_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_math_28_0_0_alpha1_aar.xml deleted file mode 100644 index 51fbb87..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_math_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_navigation_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_navigation_28_0_0_alpha1_aar.xml deleted file mode 100644 index 5c455e5..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_navigation_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_resources_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_resources_28_0_0_alpha1_aar.xml deleted file mode 100644 index 0c39e5a..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_resources_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_ripple_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_ripple_28_0_0_alpha1_aar.xml deleted file mode 100644 index 0f4e19e..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_ripple_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_shape_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_shape_28_0_0_alpha1_aar.xml deleted file mode 100644 index 22da5bf..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_shape_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_snackbar_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_snackbar_28_0_0_alpha1_aar.xml deleted file mode 100644 index d894729..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_snackbar_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_stateful_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_stateful_28_0_0_alpha1_aar.xml deleted file mode 100644 index 74c265b..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_stateful_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_tabs_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_tabs_28_0_0_alpha1_aar.xml deleted file mode 100644 index 4bfc7df..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_tabs_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_textfield_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_textfield_28_0_0_alpha1_aar.xml deleted file mode 100644 index 979274e..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_textfield_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_theme_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_theme_28_0_0_alpha1_aar.xml deleted file mode 100644 index a216a1b..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_theme_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_transformation_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_transformation_28_0_0_alpha1_aar.xml deleted file mode 100644 index bd5a375..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_transformation_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_typography_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_typography_28_0_0_alpha1_aar.xml deleted file mode 100644 index 729dbee..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_typography_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_widget_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_design_widget_28_0_0_alpha1_aar.xml deleted file mode 100644 index d9b284a..0000000 --- a/.idea/libraries/Gradle__com_android_support_design_widget_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_documentfile_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_documentfile_28_0_0_alpha1_aar.xml deleted file mode 100644 index a862cbd..0000000 --- a/.idea/libraries/Gradle__com_android_support_documentfile_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_drawerlayout_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_drawerlayout_28_0_0_alpha1_aar.xml deleted file mode 100644 index 8dab8fb..0000000 --- a/.idea/libraries/Gradle__com_android_support_drawerlayout_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_interpolator_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_interpolator_28_0_0_alpha1_aar.xml deleted file mode 100644 index 3cb0a68..0000000 --- a/.idea/libraries/Gradle__com_android_support_interpolator_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_loader_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_loader_28_0_0_alpha1_aar.xml deleted file mode 100644 index ac68328..0000000 --- a/.idea/libraries/Gradle__com_android_support_loader_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_localbroadcastmanager_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_localbroadcastmanager_28_0_0_alpha1_aar.xml deleted file mode 100644 index 31f1851..0000000 --- a/.idea/libraries/Gradle__com_android_support_localbroadcastmanager_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_print_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_print_28_0_0_alpha1_aar.xml deleted file mode 100644 index 687bbe7..0000000 --- a/.idea/libraries/Gradle__com_android_support_print_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_recyclerview_v7_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_recyclerview_v7_28_0_0_alpha1_aar.xml deleted file mode 100644 index f610322..0000000 --- a/.idea/libraries/Gradle__com_android_support_recyclerview_v7_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_slidingpanelayout_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_slidingpanelayout_28_0_0_alpha1_aar.xml deleted file mode 100644 index a1aa1a0..0000000 --- a/.idea/libraries/Gradle__com_android_support_slidingpanelayout_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_annotations_23_4_0_jar.xml b/.idea/libraries/Gradle__com_android_support_support_annotations_23_4_0_jar.xml deleted file mode 100644 index b793b79..0000000 --- a/.idea/libraries/Gradle__com_android_support_support_annotations_23_4_0_jar.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_annotations_28_0_0_alpha1_jar.xml b/.idea/libraries/Gradle__com_android_support_support_annotations_28_0_0_alpha1_jar.xml deleted file mode 100644 index 03841e0..0000000 --- a/.idea/libraries/Gradle__com_android_support_support_annotations_28_0_0_alpha1_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_compat_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_support_compat_28_0_0_alpha1_aar.xml deleted file mode 100644 index 1612c90..0000000 --- a/.idea/libraries/Gradle__com_android_support_support_compat_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_core_ui_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_support_core_ui_28_0_0_alpha1_aar.xml deleted file mode 100644 index 021f3c0..0000000 --- a/.idea/libraries/Gradle__com_android_support_support_core_ui_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_core_utils_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_support_core_utils_28_0_0_alpha1_aar.xml deleted file mode 100644 index 614632c..0000000 --- a/.idea/libraries/Gradle__com_android_support_support_core_utils_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_fragment_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_support_fragment_28_0_0_alpha1_aar.xml deleted file mode 100644 index 04c333a..0000000 --- a/.idea/libraries/Gradle__com_android_support_support_fragment_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_v4_23_4_0_aar.xml b/.idea/libraries/Gradle__com_android_support_support_v4_23_4_0_aar.xml deleted file mode 100644 index 87e92a3..0000000 --- a/.idea/libraries/Gradle__com_android_support_support_v4_23_4_0_aar.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_vector_drawable_23_4_0_aar.xml b/.idea/libraries/Gradle__com_android_support_support_vector_drawable_23_4_0_aar.xml deleted file mode 100644 index 6191bb3..0000000 --- a/.idea/libraries/Gradle__com_android_support_support_vector_drawable_23_4_0_aar.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_vector_drawable_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_support_vector_drawable_28_0_0_alpha1_aar.xml deleted file mode 100644 index ed30d3a..0000000 --- a/.idea/libraries/Gradle__com_android_support_support_vector_drawable_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_swiperefreshlayout_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_swiperefreshlayout_28_0_0_alpha1_aar.xml deleted file mode 100644 index 0ad326c..0000000 --- a/.idea/libraries/Gradle__com_android_support_swiperefreshlayout_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_core_2_2_2_aar.xml b/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_core_2_2_2_aar.xml deleted file mode 100644 index 04bb167..0000000 --- a/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_core_2_2_2_aar.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_idling_resource_2_2_2_aar.xml b/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_idling_resource_2_2_2_aar.xml deleted file mode 100644 index 63ce6b3..0000000 --- a/.idea/libraries/Gradle__com_android_support_test_espresso_espresso_idling_resource_2_2_2_aar.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_test_exposed_instrumentation_api_publish_0_5_aar.xml b/.idea/libraries/Gradle__com_android_support_test_exposed_instrumentation_api_publish_0_5_aar.xml deleted file mode 100644 index 5fea9bd..0000000 --- a/.idea/libraries/Gradle__com_android_support_test_exposed_instrumentation_api_publish_0_5_aar.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_test_rules_0_5_aar.xml b/.idea/libraries/Gradle__com_android_support_test_rules_0_5_aar.xml deleted file mode 100644 index 5b8abd2..0000000 --- a/.idea/libraries/Gradle__com_android_support_test_rules_0_5_aar.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_test_runner_0_5_aar.xml b/.idea/libraries/Gradle__com_android_support_test_runner_0_5_aar.xml deleted file mode 100644 index 7b97cd0..0000000 --- a/.idea/libraries/Gradle__com_android_support_test_runner_0_5_aar.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_transition_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_transition_28_0_0_alpha1_aar.xml deleted file mode 100644 index 52064ee..0000000 --- a/.idea/libraries/Gradle__com_android_support_transition_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_viewpager_28_0_0_alpha1_aar.xml b/.idea/libraries/Gradle__com_android_support_viewpager_28_0_0_alpha1_aar.xml deleted file mode 100644 index f3eabce..0000000 --- a/.idea/libraries/Gradle__com_android_support_viewpager_28_0_0_alpha1_aar.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1_jar.xml b/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1_jar.xml deleted file mode 100644 index 947e251..0000000 --- a/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1_jar.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1_jar.xml b/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1_jar.xml deleted file mode 100644 index 5c4dd4e..0000000 --- a/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_11_0_jar.xml b/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_11_0_jar.xml deleted file mode 100644 index 733bbc4..0000000 --- a/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_11_0_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okio_okio_1_14_0_jar.xml b/.idea/libraries/Gradle__com_squareup_okio_okio_1_14_0_jar.xml deleted file mode 100644 index 9c3a836..0000000 --- a/.idea/libraries/Gradle__com_squareup_okio_okio_1_14_0_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__javax_annotation_javax_annotation_api_1_2_jar.xml b/.idea/libraries/Gradle__javax_annotation_javax_annotation_api_1_2_jar.xml deleted file mode 100644 index 8ebd3e8..0000000 --- a/.idea/libraries/Gradle__javax_annotation_javax_annotation_api_1_2_jar.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__javax_inject_javax_inject_1_jar.xml b/.idea/libraries/Gradle__javax_inject_javax_inject_1_jar.xml deleted file mode 100644 index f9c9a30..0000000 --- a/.idea/libraries/Gradle__javax_inject_javax_inject_1_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__junit_junit_4_12_jar.xml b/.idea/libraries/Gradle__junit_junit_4_12_jar.xml deleted file mode 100644 index f4f25a8..0000000 --- a/.idea/libraries/Gradle__junit_junit_4_12_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3_jar.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3_jar.xml deleted file mode 100644 index 50cf2b9..0000000 --- a/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3_jar.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3_jar.xml deleted file mode 100644 index a5eaca5..0000000 --- a/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3_jar.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3_jar.xml deleted file mode 100644 index b4dabdc..0000000 --- a/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jsoup_jsoup_1_9_2_jar.xml b/.idea/libraries/Gradle__org_jsoup_jsoup_1_9_2_jar.xml deleted file mode 100644 index 18bad12..0000000 --- a/.idea/libraries/Gradle__org_jsoup_jsoup_1_9_2_jar.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml deleted file mode 100644 index 076726f..0000000 --- a/.idea/markdown-navigator.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml deleted file mode 100644 index 57927c5..0000000 --- a/.idea/markdown-navigator/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 692ca5f..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - Android - - - Android > Lint > Correctness - - - Android > Lint > Performance - - - Android > Lint > Usability > Icons - - - Code style issuesJava - - - Java - - - - - - - - - - - - - - - - - - 1.8 - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index cc7b6e6..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index db2bdb4..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,5075 +0,0 @@ - - - - - - android-26 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $USER_HOME$/.subversion - - - - - 1510560694935 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/StringFullArrangement.kt - 49 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/StringFullArrangement.kt - 50 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/StringFullArrangement.kt - 46 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/StringFullArrangement.kt - 30 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/StringFullArrangement.kt - 51 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionbucket.kt - 152 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionbucket.kt - 155 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionbucket.kt - 153 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionbucket.kt - 156 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionbucket.kt - 56 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionbucket.kt - 57 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 263 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 270 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 277 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 284 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 291 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 298 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 305 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 312 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 332 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 351 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 369 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 387 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 394 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 400 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 102 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 88 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 90 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustionAlbertEinstein.kt - 95 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustion24.kt - 79 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustion24.kt - 92 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustion24.kt - 62 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustion24.kt - 84 - - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustion24.kt - 89 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustion24.kt - 64 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/algorithm/exhaustion24.kt - 61 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/java/condition/TestLinkBlockQueue.kt - 36 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/ArrayTest.kt - 38 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/ArrayTest.kt - 43 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode25.kt - 57 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode25.kt - 59 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode25.kt - 64 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode25.kt - 50 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode25.kt - 53 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode25.kt - 52 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt - 37 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt - 38 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt - 40 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt - 23 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt - 26 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt - 27 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt - 29 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt - 32 - - - - file://$PROJECT_DIR$/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt - 30 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 438 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 440 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 441 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 443 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 444 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 446 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 448 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 450 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 451 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 338 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 348 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 349 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 351 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 352 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 354 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 356 - - - - file://$USER_HOME$/Library/Android/sdk/sources/android-28/java/util/concurrent/LinkedBlockingQueue.java - 359 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DataStructure.iml b/DataStructure.iml deleted file mode 100644 index dc1d2f2..0000000 --- a/DataStructure.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index 542e081..fd556b0 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ - [选择排序](https://github.com/UCodeUStory/DataStructure/blob/master/app/src/main/java/com/wangpos/datastructure/sort/OptionSortActivity.java) - [冒泡排序](https://github.com/UCodeUStory/DataStructure/blob/master/app/src/main/java/com/wangpos/datastructure/sort/BubbleSortActivity.java) - [线程与锁详解](https://github.com/UCodeUStory/DataStructure/blob/master/app/src/main/java/com/wangpos/datastructure/java/JavaThreadActivity.java) +- [二叉树的性质](https://github.com/UCodeUStory/DataStructure/blob/master/sources/binearyTree.md) - 二叉树的遍历 - 二叉排序树 - 红黑树 @@ -26,6 +27,7 @@ - 有向图的创建 - [拓扑排序-邻接矩阵存储-Kahn算法](https://github.com/UCodeUStory/DataStructure/blob/master/app/src/main/java/com/wangpos/datastructure/graph/TopologicalOrderActivity.java) - 拓扑排序-邻接矩阵存储-深度优先搜索算法 +- [邻接矩阵和邻接表比较](https://github.com/UCodeUStory/DataStructure/blob/master/sources/matrix_table.md) - [最短路径算法之Dijkstra算法(狄克斯特拉算法](https://github.com/UCodeUStory/DataStructure/blob/master/app/src/main/java/com/wangpos/datastructure/graph/DjstaActivity.java) - [ArrayList实现原理](https://github.com/UCodeUStory/DataStructure/blob/master/app/src/main/java/com/wangpos/datastructure/java/mylist/CJArrayList.java) - [LinkList双向实现](https://github.com/UCodeUStory/DataStructure/blob/master/app/src/main/java/com/wangpos/datastructure/java/mylist/CJArrayList.java) @@ -177,7 +179,7 @@ 6. [Retrofit 源码分析](https://github.com/UCodeUStory/DataStructure/blob/master/sources/retrofit.md) 7. [ARouter 源码分析] 8. [LeakCanary 源码分析] -9. [Blockcanary 源码分析] +9. [Blockcanary 源码分析](https://github.com/UCodeUStory/DataStructure/blob/master/sources/blockcanary.md) 10. [Lifecycler源码分析] 11. [RxJava 源码分析](https://github.com/UCodeUStory/DataStructure/blob/master/sources/androidopensources/rxjavasource.md) 12. [ViewModel 源码分析](https://github.com/UCodeUStory/DataStructure/blob/master/sources/viewmodel.md) diff --git a/app/app.iml b/app/app.iml deleted file mode 100644 index a95c9df..0000000 --- a/app/app.iml +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/MainActivity.java b/app/src/main/java/com/wangpos/datastructure/MainActivity.java index bd2f6f9..421d6a2 100644 --- a/app/src/main/java/com/wangpos/datastructure/MainActivity.java +++ b/app/src/main/java/com/wangpos/datastructure/MainActivity.java @@ -172,9 +172,7 @@ public void onItemClick(AdapterView adapterView, View view, int i, long l) { private void onClickItem(DataBean data) { switch (data.type){ case ToGitHub: - Intent toGitHubIntent = new Intent(this, WebViewActivity.class); - toGitHubIntent.putExtra(WebViewActivity.EXTRA_URL,"https://github.com/UCodeUStory"); - startActivity(toGitHubIntent); + launchWebView("https://github.com/UCodeUStory"); break; case TimeComplexity: startActivity(new Intent(this,TimeComplexityActivity.class)); @@ -242,30 +240,20 @@ private void onClickItem(DataBean data) { case MaxDataSelectData: startActivity(new Intent(this,MaxDataSelectDataActivity.class)); case HashTable: - Intent hashIntent = new Intent(this, WebViewActivity.class); - hashIntent.putExtra(WebViewActivity.EXTRA_URL,"https://github.com/UCodeUStory/DataStructure/blob/master/hashtable.md"); - startActivity(hashIntent); + launchWebView("https://github.com/UCodeUStory/DataStructure/blob/master/hashtable.md"); break; case binarySearchTree: - Intent binarySearchIntent = new Intent(this, WebViewActivity.class); - binarySearchIntent.putExtra(WebViewActivity.EXTRA_URL,"https://github.com/UCodeUStory/DataStructure/blob/master/sources/tree.md"); - startActivity(binarySearchIntent); + launchWebView("https://github.com/UCodeUStory/DataStructure/blob/master/sources/tree.md"); break; case Singleton: - Intent singletonIntent = new Intent(this, WebViewActivity.class); - singletonIntent.putExtra(WebViewActivity.EXTRA_URL,"https://github.com/UCodeUStory/DataStructure/blob/master/sources/singleInstance.md"); - startActivity(singletonIntent); + launchWebView("https://github.com/UCodeUStory/DataStructure/blob/master/sources/singleInstance.md"); break; case TU: - Intent tuIntent = new Intent(this, WebViewActivity.class); - tuIntent.putExtra(WebViewActivity.EXTRA_URL,"https://github.com/UCodeUStory/DataStructure/blob/master/sources/tu.md"); - startActivity(tuIntent); + launchWebView("https://github.com/UCodeUStory/DataStructure/blob/master/sources/tu.md"); break; case JavaGC: - Intent javaGcIntent = new Intent(this, WebViewActivity.class); - javaGcIntent.putExtra(WebViewActivity.EXTRA_URL,"https://github.com/UCodeUStory/DataStructure/blob/master/sources/JavaGarbageCollection.md"); - startActivity(javaGcIntent); + launchWebView("https://github.com/UCodeUStory/DataStructure/blob/master/sources/JavaGarbageCollection.md"); break; case MAXSubString: startActivity(new Intent(this, MaxSubStringActivity.class)); @@ -302,6 +290,12 @@ private void onClickItem(DataBean data) { } + private void launchWebView(String s) { + Intent tuIntent = new Intent(this, WebViewActivity.class); + tuIntent.putExtra(WebViewActivity.EXTRA_URL, s); + startActivity(tuIntent); + } + private void initData(USList list) { list.add(new DataBean(ToGitHub,"进入作者GitHub")); list.add(new DataBean(TimeComplexity,"时间复杂度介绍")); diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicCirsscrossString.java b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicCirsscrossString.java new file mode 100644 index 0000000..2171866 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicCirsscrossString.java @@ -0,0 +1,53 @@ +package com.wangpos.datastructure.algorithm; + +public class DynamicCirsscrossString { + public static final int ROW = 3; + public static final int COLUMN = 3; + + public static void main(String[] args) { + + + int map[][] = new int[][]{{-2, -3, 3}, {-5, -10, 1}, {0, 30, -5}}; + int result = getMinBlood(map); + System.out.println("最少血量" + result); + } + + + public static int getMinBlood(int[][] map) { + + int dp[][] = new int[ROW][COLUMN]; + + //初始化第一行 + dp[0][0] = 1 + getCurrentPositionNeedBlood(map[0][0]); + for (int i = 1; i < ROW; i++) { + dp[0][i] = dp[0][i-1] + getCurrentPositionNeedBlood(map[0][i]); + } + for(int j =1;j arr[j]) { + //这个公式你要品,你细品 + dp[i] = Math.max(dp[i], dp[j] + 1); + } + } + } + + System.out.println(Arrays.toString(dp)); + + int max = 0; + int maxIndex = 0; + //找到最大值 + for (int k = dp.length - 1; k >= 0; k--) { + if (dp[k] > max) { + max = dp[k]; + maxIndex = k; + } + } + + System.out.println("max=" + max + "maxIndex=" + maxIndex); + System.out.println(arr[maxIndex]); + for (int m = maxIndex; m >= 0; m--) { + if (arr[m] < arr[maxIndex] && dp[m] == dp[maxIndex] - 1) { + maxIndex = m; + System.out.println(arr[m]); + } + } + } + + // O N*N; 通过二分查找优化成Ologn + + /** + * 通过递增子串的规则,我们发现 + *

+ * 每次我们都找一个最小 + * + * @param arr + */ + private static void findTwoSplit(int[] arr) { + //存储第i个位置结尾,最长递增子串长度 + + //根据最后一个dp 值向前遍历,找打小于他的一个值,并且dp[i] = dp[7]-1 + + int dp[] = new int[arr.length]; + //有效值 + int ends[] = new int[arr.length]; + ends[0] = arr[0]; + dp[0] = 1; + // 0 right有效区 + int right = 0; + for (int i = 1; i < arr.length; i++) { + int l = 0; + int r = right; + while (l <= r) { + int mid = (l + r) / 2; + if (arr[i] > ends[mid]) { + l = mid + 1; + } else { + r = mid - 1; + } + } + if (l > right) {//有效区扩张 + right = l; + } + ends[l] = arr[i]; + dp[i] = l + 1; + +// for (int j = 0; j < i; j++) { +// //与前面每一个比较如果大于就比较一下对应dp值是否是最大的赋值给当前 +// if (arr[i] > arr[j]) { +// //这个公式你要品,你细品 +// dp[i] = Math.max(dp[i], dp[j] + 1); +// } +// } + } + + System.out.println(Arrays.toString(dp)); + + int max = 0; + int maxIndex = 0; + //找到最大值 + for (int k = dp.length - 1; k >= 0; k--) { + if (dp[k] > max) { + max = dp[k]; + maxIndex = k; + } + } + + System.out.println("max=" + max + "maxIndex=" + maxIndex); + System.out.println(arr[maxIndex]); + for (int m = maxIndex; m >= 0; m--) { + if (arr[m] < arr[maxIndex] && dp[m] == dp[maxIndex] - 1) { + maxIndex = m; + System.out.println(arr[m]); + } + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMaxLongSubSequence.java b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMaxLongSubSequence.java new file mode 100644 index 0000000..1680018 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMaxLongSubSequence.java @@ -0,0 +1,78 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.Arrays; +import java.util.Comparator; + +public class DynamicMaxLongSubSequence { + + public static void main(String[] args) { + + String str1 = "1A2C3D4B56"; + + String str2 = "B1D23CA45B6A"; + + + String maxLongsubSequence = getMaxLongSubSequence(str1, str2); + + System.out.println(maxLongsubSequence); + } + + private static String getMaxLongSubSequence(String str1, String str2) { + + + char[] charArray1 = str1.toCharArray(); + char[] charArray2 = str2.toCharArray(); + + int[][] dp = new int[str1.length()][str2.length()]; + + dp[0][0] = (charArray1[0] == charArray2[0] ? 1 : 0); + + //填充第一行 + for (int i = 1; i < str1.length(); i++) { + int count = (charArray1[i] == charArray2[0] ? 1 : 0); + dp[i][0] = Math.max(dp[i - 1][0], count); + } + //填充第一列 + for (int j = 1; j < str2.length(); j++) { + int count = (charArray1[0] == charArray2[j] ? 1 : 0); + dp[0][j] = Math.max(dp[0][j - 1], count); + } + + 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 (charArray1[i] == charArray2[j]) { + //相等 并不是直接增加1 ,因为前面有可能增加过,所以要和前一行前一列的值+1比较 + dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + 1); + } + } + } + + int m = str1.length() - 1; + int n = str2.length() - 1; + //获取子序列 + char[] res = new char[dp[str1.length() - 1][str2.length() - 1]]; + + int index = res.length - 1; + while (index >= 0) { + if (n > 0 && dp[m][n] == dp[m][n - 1]) { + n--; + } else if (m > 0 && dp[m][n] == dp[m - 1][n]) { + m--; + } else { + res[index--] = charArray1[m]; + m--; + n--; + } + } + return Arrays.toString(res); + } + +} + + + + + + diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMaxLongSubString.java b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMaxLongSubString.java new file mode 100644 index 0000000..b2b8223 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMaxLongSubString.java @@ -0,0 +1,105 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.Arrays; + +public class DynamicMaxLongSubString { + + public static void main(String[] args) { + + String str1 = "1AB2345CD"; + + String str2 = "12345EF"; + + + String maxLongsubSequence = getMaxLongSubString(str1, str2); + + System.out.println(maxLongsubSequence); + } + + /** + * 1 1 1 1 1 1 1 + * 1 1 1 1 1 1 1 + * 1 1 1 1 1 1 1 + * 1 1 1 1 1 1 1 + * 1 1 2 2 2 2 2 + * 1 1 2 3 3 3 3 + * 1 1 2 3 4 4 4 + * 1 1 2 3 4 4 4 + * 1 1 2 3 4 4 4 + * [2, 3, 4, 5] + * + * @param str1 + * @param str2 + * @return + */ + private static String getMaxLongSubString(String str1, String str2) { + + + char[] charArray1 = str1.toCharArray(); + char[] charArray2 = str2.toCharArray(); + + int[][] dp = new int[str1.length()][str2.length()]; + + dp[0][0] = (charArray1[0] == charArray2[0] ? 1 : 0); + + //填充第一行 + for (int i = 1; i < str1.length(); i++) { + int count = (charArray1[i] == charArray2[0] ? 1 : 0); + dp[i][0] = Math.max(dp[i - 1][0], count); + } + //填充第一列 + for (int j = 1; j < str2.length(); j++) { + int count = (charArray1[0] == charArray2[j] ? 1 : 0); + dp[0][j] = Math.max(dp[0][j - 1], count); + } + + 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 (charArray1[i] == charArray2[j] + && charArray1[i - 1] == charArray2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + } + } + } + printArray(dp, str1.length(), str2.length()); + char resultArray[] = new char[dp[str1.length() - 1][str2.length() - 1]]; + int i = resultArray.length - 1; + + + for (int j = str1.length() - 1; j > 0; j--) { + int a = dp[j][str2.length() - 1]; + int b = dp[j - 1][str2.length() - 1]; + if (a > b) { + resultArray[i--] = charArray1[j]; + } + if (i == 0 && a <= b) { + resultArray[i--] = charArray1[j]; + } + if (i < 0) { + break; + } else { + continue; + } + } + + + return Arrays.toString(resultArray); + } + + + private static void printArray(int[][] m, int l1, int l2) { + for (int i = 0; i < l1; i++) { + for (int j = 0; j < l2; j++) { + System.out.print(m[i][j] + " "); + } + System.out.println(); + } + } +} + + + + + + diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMoney.java b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMoney.java new file mode 100644 index 0000000..b093feb --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMoney.java @@ -0,0 +1,200 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class DynamicMoney { + + public static void main(String[] args) { + Integer m[] = new Integer[]{5, 2, 3}; + + int mInt[] = new int[]{5, 2, 3}; + //由大到小排序,效率更高 + Arrays.sort(m, Collections.reverseOrder()); + +// int curMoney = 20;//4 +// int curMoney = 19; // 5 5 5 2 2 + int curMoney = 18; // 5 5 5 3 + +// int count = splitMoney(m, 0, curMoney); + int count = minConins3(mInt, curMoney); + System.out.println("count=" + count); + } + + /** + * 思路就是遍历逐个遍历,使用 0 张 1 ,2 张直到最大 + * + * @param m + * @param index + * @param curMoney + * @return + */ + private static int splitMoney(Integer[] m, int index, int curMoney) { + //都遍历完了,也得到了最小值 + if (curMoney == 0) { + return 0; + } + + /** + * 回溯当前Size + */ + int currentSize = -1; + /** + * 遍历每一个元素,从不选,到选择最大 + */ + for (int i = index; i < m.length; i++) { + if (curMoney >= m[i]) { + int maxSelect = curMoney / m[i];//最大选择 + //从0开始 j 就是选择张数 + for (int j = 0; j <= maxSelect; j++) { + int restMoney = curMoney - m[i] * j; + int next = splitMoney(m, i + 1, restMoney); + + if (next != -1) {//有解 + if (currentSize == -1) { + //一次没有被回溯直接赋值,这里是i 加一,不是index +1 + currentSize = j + next; + } else { + currentSize = Math.min(currentSize, j + next); + } + } else { + if (restMoney == 0) { + currentSize = j; + } + } + } + } + } + return currentSize; + } + + public int minCoins1(int[] arr, int aim) { + if (arr == null || arr.length == 0 || aim < 0) { + return -1; + } + return process(arr, 0, aim); + } + + /** + * 优化两层循环合并成一层 ,因为循环不是每次都从0开始,后续的遍历不涉及到前面 + * + * @param arr + * @param i + * @param rest + * @return + */ + private int process(int[] arr, int i, int rest) { + if (i == arr.length) { + return rest == 0 ? 0 : -1; + } + + int count = -1; + + for (int k = 0; k * arr[i] <= rest; k++) { + int next = process(arr, i + 1, rest - k * arr[i]); + if (next != -1) { + count = count == -1 ? next + k : Math.min(count, next + k); + } + } + return count; + } + + + /** + * 动态规划最优实现方案 + * @param arr + * @param aim + * @return + */ + public static int minConins2(int[] arr, int aim) { + if (arr == null || arr.length == 0 || aim < 0) { + return -1; + } + int N = arr.length; + int[][] dp = new int[N + 1][aim + 1]; + //设置最后一排的值,除dp[N][0]外,其他都是-1 + + for (int col = 1; col <= aim; col++) { + dp[N][col] = -1; + } + for (int i = N - 1; i >= 0; i--) {//从底向上计算每一行 + for (int rest = 0; rest <= aim; rest++) { + dp[i][rest] = -1;//初始时先设置dp[i][rest]的值无效 + if (dp[i + 1][rest] != -1) {//下面的值如果有效 + dp[i][rest] = dp[i + 1][rest];//先设置成下面的值 + } + if (rest - arr[i] >= 0 && dp[i][rest - arr[i]] != -1) { + if (dp[i][rest] == -1) { + dp[i][rest] = dp[i][rest - arr[i]] + 1; + } else { + dp[i][rest] = Math.min(dp[i][rest], dp[i][rest - arr[i]] + 1); + } + } + } + + } + printArray(dp); + return dp[0][aim]; + } + + /** + * 动态规划普通方案 + * @param arr + * @param aim + * @return + */ + public static int minConins3(int[] arr, int aim) { + if (arr == null || arr.length == 0 || aim < 0) { + return -1; + } + int N = arr.length; + int[][] dp = new int[N + 1][aim + 1]; + //设置最后一排的值,除dp[N][0]外,其他都是-1 + + //最后一排为溢出所以都为-1无解 + for (int col = 1; col <= aim; col++) { + dp[N][col] = -1; + } + for (int i = N - 1; i >= 0; i--) {//从底向上计算每一行 + for (int rest = 0; rest <= aim; rest++) { + singleDataCalculate(arr[i], dp, i, rest); + } + } + printArray(dp);//测试打印 + return dp[0][aim]; + } + + //这个可以优化 + //把所有等式列出来发现 dp[i][rest] = Math.min(dp[i][rest], dp[i][rest - arr[i]] + 1); + private static void singleDataCalculate(int i, int[][] dp, int i2, int rest) { + dp[i2][rest] = -1;//初始时先设置dp[i][rest]的值无效 + int k = rest / i2;//可试的最大张数 + if (rest == 0) {//如果0表示不需要找钱 也就需要0张 + dp[i2][rest] = 0; + } else { + int minValue = -1;//记录最小值 + for (int j = 0; j <= k; j++) { + int next = dp[i2 + 1][rest - j * i2]; + if (next != -1) {//-1表示无解不记录统计 + if (minValue == -1) {//第一次统计,无需比较直接赋值 + minValue = next + j; + } else { + minValue = Math.min(minValue, next + j); + } + } + } + dp[i2][rest] = minValue; + } + } + + private static void printArray(int[][] m) { + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 19; j++) { + System.out.print(m[i][j] + " "); + } + System.out.println(); + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMoneyWays.java b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMoneyWays.java new file mode 100644 index 0000000..3137f73 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicMoneyWays.java @@ -0,0 +1,100 @@ +package com.wangpos.datastructure.algorithm; + +public class DynamicMoneyWays { + + public static void main(String[] args) { + + int arr[] = new int[]{5, 1}; + + int aim = 15; + /*** + * 5 + * 55 + * 555 + * 11111111 + * + * 10 5 + * 10 1 1 1 1 1 + * + */ +// int aim = 1000; + +// int result = coin(arr, 0, aim); + int result = coin2(arr, aim); + System.out.println(result); + } + + private static int coin(int[] arr, int index, int aim) { + if (index == arr.length) { + return 0; + } + int count = 0; + int maxUse = 0; + //找到小于当前面值的元素 + for (int i = index; i < arr.length; i++) { + maxUse = aim / arr[i]; + if (maxUse != 0) { + index = i; + break; + } + } + + if (maxUse != 0) {//表示没有越界 + for (int j = 0; j <= maxUse; j++) { + int rest = aim - j * arr[index]; + if (rest == 0) {//有解 + count += 1; + } else {//无解,遍历下一个 + int next = coin(arr, index + 1, rest); + if (next != 0) {//等于0无解 + count += next; + } + } + } + } + return count; + } + + /** + * 动态规划方法 + * @param arr + * @param aim + * @return + */ + private static int coin2(int[] arr, int aim) { + int dp[][] = new int[arr.length + 1][aim + 1]; + for (int i = 0; i <= arr.length; i++) { + dp[i][0] = 1; + } + + int N = arr.length - 1; + for (int i = N; i >= 0; i--) { + for (int j = 1; j <= aim; j++) { + int maxValue = j / arr[i]; + if (maxValue == 0) { + continue;//无效 + } + int count = 0; + for (int k = 0; k <= maxValue; k++) { + int before = dp[i + 1][j - k * arr[i]]; + count += before; + } + dp[i][j] = count; + + } + } + + printArray(dp); + return dp[0][aim]; + } + + + private static void printArray(int[][] m) { + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 16; j++) { + System.out.print(m[i][j] + " "); + } + System.out.println(); + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicNestLetter.java b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicNestLetter.java new file mode 100644 index 0000000..e68f0f9 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicNestLetter.java @@ -0,0 +1,92 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.Arrays; +import java.util.Comparator; + +public class DynamicNestLetter { + + public static void main(String[] args) { + int arr[][] = new int[][]{{3, 4}, {2, 3}, {4, 5}, {1, 3}, {2, 2}, {3, 6}, {1, 2}, {3, 2}, {2, 4}}; + // int arr[][] = new int[][]{{3, 4}, {2, 3}, {4, 5}, {1, 3}, {2, 2}, {3, 6}}; + + int result = calculateTwoSplit(getSortedEnvelopes(arr)); + System.out.println(result); + } + + /** + * 将数组按照按照长度排序,然后求宽度的最长增长子串 + * + * 。为什么呢?这与我们的排序策略有关,按照长度从小到大排序,长度相等的信封之间按照宽度从大到小排序。 + * + * @param arr + * @return + */ + private static int calculateTwoSplit(Envelope[] arr) { + + //存储第i个位置结尾,最长递增子串长度 + + //根据最后一个dp 值向前遍历,找打小于他的一个值,并且dp[i] = dp[7]-1 + + int dp[] = new int[arr.length]; + //有效值 + int ends[] = new int[arr.length]; + ends[0] = arr[0].wid; + dp[0] = 1; + // 0 right有效区 + int right = 0; + for (int i = 1; i < arr.length; i++) { + int l = 0; + int r = right; + while (l <= r) { + int mid = (l + r) / 2; + if (arr[i].wid > ends[mid]) { + l = mid + 1; + } else { + r = mid - 1; + } + } + if (l > right) {//有效区扩张 + right = l; + } + ends[l] = arr[i].wid; + dp[i] = l + 1; + + } + + return right + 1; + + } + + //这个排序数组,我们长度是按小到大,所以只需要看宽度的递增子序列即可 + public static Envelope[] getSortedEnvelopes(int[][] matrix) { + Envelope[] res = new Envelope[matrix.length]; + for (int i = 0; i < matrix.length; i++) { + res[i] = new Envelope(matrix[i][0], matrix[i][1]); + } + Arrays.sort(res, new EnvelopeComparator()); + return res; + } + +} + +class Envelope { + public int len; + public int wid; + + public Envelope(int weight, int hight) { + len = weight; + wid = hight; + } +} + +class EnvelopeComparator implements Comparator { + @Override + public int compare(Envelope o1, Envelope o2) { + return o1.len != o2.len ? o1.len - o2.len : o2.wid - o1.wid; + } +} + + + + + diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicRobert.java b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicRobert.java new file mode 100644 index 0000000..9999c2d --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicRobert.java @@ -0,0 +1,81 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class DynamicRobert { + + private static int N = 7; + private static int K = 10;//这里步骤要+1 + private static int P = 4;//这里数组-1 + + public static void main(String[] args) { + + int dp[][] = new int[K][N]; + + int result = way(dp); + + System.out.println("result="+result); + + printArray(dp); + } + + private static int way(int[][] dp) { + dp[0][P] = 1; + for (int i = 1; i < K; i++) { + dp[i][0] = dp[i][0] + dp[i - 1][1]; + dp[i][N - 1] = dp[i][N - 1] + dp[i - 1][N - 2]; + for (int j = 1; j < N - 1; j++) { + dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]; + } + } + + return dp[9][3]; + } + + + private static void printArray(int[][] m) { + for (int i = 0; i < K; i++) { + for (int j = 0; j < N; j++) { + System.out.print(m[i][j] + " "); + } + System.out.println(); + } + + } + + public int ways1(int N, int M, int K, int P) { + if (N < 2 || K < 1 || M < 1 || M > N || P < 1 || P > N) { + return 0; + } + return walk(N, M, K, P); + } + + + /** + * @param N 位置1~N + * @param cur 当前位置 可变参数 + * @param rest 剩余步骤 可变参数 + * @param P 最终目标位置P + * @return 表示解法数量 + */ + public int walk(int N, int cur, int rest, int P) { + + if (rest == 0) { + return cur == P ? 1 : 0; + } + + if (cur == 1) { + return walk(N, 2, rest - 1, P); + } + + if (cur == N) { + return walk(N, N - 1, rest - 1, P); + } + + return walk(N, cur + 1, rest - 1, P) + walk(N, cur - 1, rest - 1, P); + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicShootBalloon.java b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicShootBalloon.java new file mode 100644 index 0000000..f600b7b --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/DynamicShootBalloon.java @@ -0,0 +1,33 @@ +package com.wangpos.datastructure.algorithm; + +public class DynamicShootBalloon { + + public static void main(String[] args) { + + int[] arr = new int[]{3, 2, 5}; + +// int result = shoot(arr, 0, 1); + + + } + +// private static int shoot(int[] arr, int l, int r) { +// +// int score = 0; +// if (l >= 0) { +// int cv = arr[l]; +// int lv = 1; +// int rv = 1; +// if (l - 1 >= 0) { +// lv = arr[l - 1]; +// } +// if (r < arr.length) { +// rv = arr[r]; +// } +// score = lv * cv * rv; +// } +// +// +// return 0 +// } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/NEmpress.java b/app/src/main/java/com/wangpos/datastructure/algorithm/NEmpress.java new file mode 100644 index 0000000..5597c9c --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/NEmpress.java @@ -0,0 +1,69 @@ +package com.wangpos.datastructure.algorithm; + +public class NEmpress { + + public static void main(String[] args) { + // 4 == 2 + // 1 == 1 + // 2 3 == 0 + + // 8 ==92 + Queen queen = new Queen(5); + queen.backtrack(1); + } + +} + + + class Queen { + private int[] column; //同栏是否有皇后,1表示有 + private int[] rup; //右上至左下是否有皇后 + private int[] lup; //左上至右下是否有皇后 + private int[] queen; //解答 + private int num; //解答编号 + private int n = 1; + + public Queen(int N) { + this.n = N; + column = new int[n+1]; + rup = new int[(2*n)+1]; + lup = new int[(2*n)+1]; + for (int i = 1; i <= n; i++) + column[i] = 0; + for (int i = 1; i <= (2*n); i++) + rup[i] = lup[i] = 0; //初始定义全部无皇后 + queen = new int[n+1]; + } + + public void backtrack(int i) { + if (i > n) { + showAnswer(); + } else { + for (int j = 1; j <= n; j++) { + if ((column[j] == 0) && (rup[i+j] == 0) && (lup[i-j+n] == 0)) { + //若无皇后 + queen[i] = j; //设定为占用 + column[j] = rup[i+j] = lup[i-j+n] = 1; + backtrack(i+1); //循环调用 + column[j] = rup[i+j] = lup[i-j+n] = 0; + } + } + } + } + + protected void showAnswer() { + num++; + System.out.println("\n解答" + num); + for (int y = 1; y <= n; y++) { + for (int x = 1; x <= n; x++) { + if(queen[y]==x) { + System.out.print("Q"); + } else { + System.out.print("."); + } + } + System.out.println(); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringAnagram.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringAnagram.java new file mode 100644 index 0000000..418cba9 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringAnagram.java @@ -0,0 +1,56 @@ +package com.wangpos.datastructure.algorithm; + +public class StringAnagram { + + public static void main(String[] args) { + String targetString1 = "abcee"; + String targetString2 = "bcdea"; + + boolean result = isDeformation(targetString1, targetString2); + + System.out.println("结果:" + result); + + } + + /** + * 为什么要创建256个长度数组 + *

+ * ASCII编码表中一共有256个字符 + *

+ * 前128个为常用的字符 如 运算符 字母 数字等 键盘上可以显示的 + * 后 128个为 特殊字符 是键盘上找不到的字符 + * + * // 为什么有小于0 就是false, + * //首先前提我们判断过是长度相等的 + * //如果chas1 中种类多和chas1种类数量不一样,就一定会出现负数, + * //出现负数有两种,第一种是种类多的变为负数,第二种是没有的变为负数 + * @param targetString1 + * @param targetString2 + * @return + */ + private static boolean isDeformation(String targetString1, + String targetString2) { + if (targetString1 == null || targetString2 == null + || targetString1.length() != targetString2.length() + ) { + return false; + } + + char[] chas1 = targetString1.toCharArray(); + char[] chars2 = targetString2.toCharArray(); + // + int[] map = new int[256]; + + for (char c : chas1) { + map[c]++; + } + for (char c2 : chars2) { + map[c2]--; + if (map[c2] < 0) { + return false; + } + } + + return true; + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringArraySearchString.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringArraySearchString.java new file mode 100644 index 0000000..ec7f83b --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringArraySearchString.java @@ -0,0 +1,51 @@ +package com.wangpos.datastructure.algorithm; + +public class StringArraySearchString { + + public static void main(String args[]) { + String str = "a"; + + String[] strArrays = new String[]{null, "a", null, "a", null, "b", null, "c"}; + + System.out.println(getIndex(strArrays, str)); + } + + //二分法查找, + private static int getIndex(String[] strs, String str) { + if (strs == null || strs.length == 0 || str == null) { + return -1; + } + int res = -1; + int left = 0; + int right = strs.length - 1; + int mid = 0; + int i = 0; + + while (left < right) { + mid = (left + right) / 2; + if (strs[mid] != null && strs[mid].equals(str)) { + res = mid;//返回最左边,所以要继续遍历 + right = mid - 1; + } else if (strs[mid] != null) { + if (strs[mid].compareTo(str) < 0) { + left = mid + 1; + } else { + right = mid - 1; + } + } else { + i = mid; + while (strs[i] == null && --i >= left) ; + + if (i < left || strs[i].compareTo(str) < 0) { + left = mid + 1; + } else { + res = strs[i].equals(str) ? i : res; + right = i - 1; + } + } + } + + + return res; + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringBracketStringInValid.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringBracketStringInValid.java new file mode 100644 index 0000000..516f8cd --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringBracketStringInValid.java @@ -0,0 +1,79 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.Arrays; +import java.util.Stack; + +public class StringBracketStringInValid { + + public static void main(String[] args) { + + String str = "()()()"; + String str2 = "((()()(()("; + String str3 = "121()()()"; + System.out.println("result=" + inValidBracketString(str)); + System.out.println("result=" + inValidBracketString(str3)); + + String str4 = "())"; + + String str5 = "()(()()("; + + System.out.println(maxLengthBrcketString(str4)); + + System.out.println(maxLengthBrcketString(str5)); + } + + public static boolean inValidBracketString(String origin) { + char[] arrays = origin.toCharArray(); + Stack stack = new Stack(); + + for (char data : arrays) { + if (data != '(' && data != ')') { + return false; + } + if (stack.isEmpty()) { + stack.push(data); + } else { + char top = stack.peek(); + if (top == '(' && data == ')') { + stack.pop(); + } else { + stack.push(data); + } + } + } + + if (stack.isEmpty()) { + return true; + } + return false; + } + + + public static int maxLengthBrcketString(String origin) { + char[] arrays = origin.toCharArray(); + int length = arrays.length; + int dp[] = new int[length]; + //dp的值代表以当前结尾最长有效子串长度,什么意思? 比如()( dp[0]=0 dp[1]=2 dp[2] = 0 + //(这里我会有疑问,我们以为dp[2]= 2 其实不是 + // (() dp[2] = 2 如果结尾是) 从后向前找有效数量 + // ()(() dp[4] = 2 从后向前找到 + //()(()() dp[6] = 4 pre = 5 pre-1 = 4 dp[pre-1] = 2 + //()()) dp[4] = 0 + dp[0] = 0; + int pre = 0; + int res = 0; + for (int i = 1; i < arrays.length; i++) { + if (arrays[i] == ')') { + pre = i - dp[i - 1] - 1; + if (pre >= 0 && arrays[pre] == '(') { + //()(()()) + dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0); + } + } + res = Math.max(res, dp[i]); + } + System.out.println(Arrays.toString(dp)); + return res; + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringContactMinDictionaryRank.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringContactMinDictionaryRank.java new file mode 100644 index 0000000..eee0241 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringContactMinDictionaryRank.java @@ -0,0 +1,37 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.Arrays; +import java.util.Comparator; + + +/** + * 排序比较就可以了,重要的是排序条件 + */ +public class StringContactMinDictionaryRank { + + public static void main(String[] args) { + String[] strArray = new String[]{"abc", "bcd", "acd"}; + + System.out.println(lowString(strArray)); + + } + + public static class MyComparator implements Comparator{ + @Override + public int compare(String o1, String o2) { + return (o1+02).compareTo(o2+o1); + } + } + public static String lowString(String[] strs) { + if (strs == null || strs.length == 0) { + return ""; + } + + Arrays.sort(strs, new MyComparator()); + String res = ""; + for (int i = 0; i < strs.length; i++) { + res += strs[i]; + } + return res; + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringFormulaCalculate.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringFormulaCalculate.java new file mode 100644 index 0000000..9894ef4 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringFormulaCalculate.java @@ -0,0 +1,213 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.Deque; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * 支持整数加减乘除公式 + */ +public class StringFormulaCalculate { + + public static void main(String[] args) { + /** + * 加减法计算 + */ + String formula = "1+2-1+5-6"; + /** + * 加减乘 + */ + String formula1 = "1+2*3"; //7 + String formula2 = "1+2*3+4"; //11 +// String formula3 = "1*2+3+4"; //9 + String formula4 = "1-2+3*4+6/2";//14 + + String formula5 = "2*(4-2)+5"; + + String formula6 = "2*(4-2)"; + + String formula7 = "(4-2)*2"; + String formula8 = "10*((5-2)-2)"; + String formula9 = "48*((70-65)-43)+8*1"; +// String formula = "48*((70-65)-43)+8*1"; +// String formula = "48*((70-65)-43)+8*1"; + +// calculate(formula1, 0); +// calculate(formula2, 0); +// calculate(formula3, 0); +// calculate(formula4,0); + calculate(formula9, 0); + Deque queues2 = queues; + System.out.println("结果" + queues); + } + + /** + * 存储 数字和运算符 + */ + private static Deque queues = new LinkedList<>(); + + private static void addLastNum(Integer cur) { + String curNum = cur.toString(); + if (queues.size() > 1) { + String sign = queues.removeLast(); + String prev = queues.removeLast(); + int result = calculateExpress(prev, curNum, sign); + queues.add(String.valueOf(result)); + } else { + queues.add(curNum); + } + if (queues.size() > 1) { + String last = queues.removeLast(); + addLastNum(Integer.valueOf(last)); + } + } + + /** + * 新加元素进行判断,如果前面是* / 直接运算,然后存入 + * 如果+ - 暂时不运算 + */ + private static void addNum(Integer cur) { + String curNum = cur.toString(); + String sign = queues.peekLast(); + if ("*".equals(sign) || "/".equals(sign)) { + queues.removeLast(); + String lastNum = queues.pollLast(); + int result = calculateExpress(lastNum, curNum, sign); + queues.add(String.valueOf(result)); + } else if ("+".equals(sign) || "-".equals(sign)) { + queues.add(curNum); + } else { + queues.add(curNum); + } + } + + /** + * 如果+ - ,前两个有值运算前两个 + * 否者直接加入 + * + * @param sign + */ + private static Integer addSign(char sign) { + if (sign == '+' || sign == '-' || sign == '(') { + String last = queues.peekLast(); + if ("(".equals(last) || queues.size() < 2) { + } else if (queues.size() > 2) { + String prev1 = queues.removeLast(); + String s = queues.removeLast(); + String prev3 = queues.removeLast(); + if ("(".equals(prev1)||"(".equals(s)||"(".equals(prev3)){ + queues.add(prev3); + queues.add(s); + queues.add(prev1); + }else { + int result = calculateExpress(prev3, prev1, s); + queues.add(String.valueOf(result)); + } + } + queues.add(String.valueOf(sign)); + } else if (sign == '*' || sign == '/') { + queues.add(String.valueOf(sign)); + } + + if (sign == ')') { + String prev1 = queues.removeLast(); + String s = queues.removeLast(); + String prev3 = queues.removeLast(); + int result = calculateExpress(prev3, prev1, s); + queues.removeLast();//移除左括号 + queues.add(String.valueOf(result)); + return result; + } + return 0; + } + + /** + * 结果表示 遍历到哪一位,和计算结果 + * + * @param formula + * @param + * @return + */ + private static int[] calculate(String formula, int index) { + + int s1 = 0; + + char[] f = formula.toCharArray(); + for (int i = index; i < formula.length(); i++) { + if (isNumber(f[i])) { + //转数字 + s1 = s1 * 10 + f[i] - '0'; + + } else if (isSign(f[i])) { + // 运算符前一定有数字 + if(s1>0) { + addNum(s1); + s1 = 0; + } + addSign(f[i]); + } else if (f[i] == '(') { + addSign(f[i]); + int result[] = calculate(formula, i + 1); + i = result[1]; + //记录回溯的位置,因为后面还可能有元素要处理 + //比如 1 + 2 *( 3 + 4 )+ 5 + } else if (f[i] == ')') { + addNum(s1); + int result = addSign(f[i]); + s1 = 0; + return new int[]{result, i}; + } + + } + /** + * 综合计算 + */ + if (s1 != 0) { + addLastNum(s1); + s1 = 0; + }else{ + if(queues.size()>1){ + String last = queues.removeLast(); + addLastNum(Integer.valueOf(last)); + } + } + + return new int[]{0, formula.length()}; + } + + private static boolean isSign(char c) { + if (c == '*' || c == '/' || c == '-' || c == '+') { + return true; + } + return false; + } + + private static boolean isNumber(char c) { + return c >= '0' && c <= '9'; + } + + private static int calculateExpress(String s1, String s2, String sign) { + int num1 = Integer.parseInt(s1); + int num2 = Integer.parseInt(s2); + int result = 0; + switch (sign) { + case "*": + result = num1 * num2; + break; + case "/": + result = num1 / num2; + break; + case "+": + result = num1 + num2; + break; + case "-": + result = num1 - num2; + break; + } + return result; + } + + +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringGetMinCut.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringGetMinCut.java new file mode 100644 index 0000000..31546c2 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringGetMinCut.java @@ -0,0 +1,19 @@ +package com.wangpos.datastructure.algorithm; + +public class StringGetMinCut { + + public static void main(String[]args){ + + String originStr = "ACDCDCDAD"; + + + //A 0 + //AC 1 + // ACD 2 + // ACDC 1 + // ACDCD 2 + // ACDCDC 2 + + + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringISRotation.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringISRotation.java new file mode 100644 index 0000000..59c448c --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringISRotation.java @@ -0,0 +1,38 @@ +package com.wangpos.datastructure.algorithm; + +public class StringISRotation { + + public static void main(String[] args) { + + String a = "abcd1"; + String b = "1abcd"; + + boolean result = isRotation(a, b); + + System.out.println("结果:" + result); + } + + private static boolean isRotation(String a, String b) { + if (a == null || b == null || a.length() != b.length()) { + return false; + } + String b2 = b + b; + return StringKMP.getIndexOf(b2,a)!=-1; + } + + //KMP算法求是否包含子串 ,时间复杂度O(n+p) + private static int getIndexOf(String s, String m) { + + if (s == null || m == null || m.length() < 1 || s.length() < m.length()) { + return -1; + } + + char[] ss = s.toCharArray(); + char[] ms = m.toCharArray(); + int si = 0; + int mi = 0; +// int []next = getNextArray(ms); + return 0; + + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringKMP.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringKMP.java new file mode 100644 index 0000000..a371502 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringKMP.java @@ -0,0 +1,74 @@ +package com.wangpos.datastructure.algorithm; + +public class StringKMP { + + public static void main(String[] args) { + String str1 = "ababacdcdefcdcag"; + String str2 = "cdca"; + + System.out.println(getIndexOf(str1, str2)); + } + + static int getIndexOf(String source, String target) { + return kmp(source.toCharArray(), target.toCharArray()); + } + + static int kmp(char[] s, char[] p) { + int nextLength = Math.min(s.length, p.length); + int i = 0; + int j = 0; + int[] next = new int[nextLength]; + getNextVal(p, next); + int sLen = s.length; + int pLen = p.length; + while (i < sLen && j < pLen) { + //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++ + if (j == -1 || s[i] == p[j]) { + i++;//等于-1 和匹配成功都++,为什么-1还++,表示前面还没有匹配成功 + j++; + } else { + //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j] + //next[j]即为j所对应的next值 + j = next[j]; + } + } + if (j == pLen) + return i - j; //返回p在S中的位置 + else + return -1; + } + + + /** + * 获取K值数组 + * + * @param p + * @param next + * + */ + static void getNextVal(char[] p, int next[]) { + int pLen = p.length; + next[0] = -1; + int k = -1; + int j = 0; + while (j < pLen-1) { + //p[k]表示前缀,p[j]表示后缀 + if (k == -1 || p[j] == p[k]) { + j++; + k++; +// next[j] = k; + + if (p[j] != p[k]) + next[j] = k; //之前只有这一行 + else + //因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]] + next[j] = next[k]; + + } else { + k = next[k]; + + } + } + + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringMaxLengthNoRepeatSequence.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringMaxLengthNoRepeatSequence.java new file mode 100644 index 0000000..ccb5e76 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringMaxLengthNoRepeatSequence.java @@ -0,0 +1,45 @@ +package com.wangpos.datastructure.algorithm; + +public class StringMaxLengthNoRepeatSequence { + + public static void main(String[] args) { + String str = "abcdaef"; + String str2 = "abcdaefd"; + System.out.println(getMaxLengthNoRepeatSequence(str2)); + + } + + /** + * 分析 + * abcda + * 当我们编译如果不之前没有出现过就算在内,如果出现过就保存当前不重复长度, + * 然后将启示位置跳转到重复元素第一次出现的地方,比如重复元素默认位置是-1 + * 当array[4]位置又出现a ,判断曾经出现过, + * 我们保存元素可以使用一个256数组即可,数组里面对应位置保存的是对应位置 + * + * @param s + * @return + */ + public static int getMaxLengthNoRepeatSequence(String s) { + if (s == null || s.equals("")) { + return 0; + } + char[] chas = s.toCharArray(); + int[] map = new int[256]; + for (int i = 0; i < 256; i++) { + map[i] = -1; + } + int len = 0;//最长长度 + int pre = -1;//保存前一个位置 + int cur = 0;//保存当前位置到前一个重复位置的长度 + for (int i = 0; i != chas.length; i++) { + //重复字符串的头部,如果map[chas[i]]有值,证明就是重复的 + pre = Math.max(pre, map[chas[i]]); + cur = i - pre; + len = Math.max(len, cur); + map[chas[i]] = i; + } + return len; + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringMerged.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringMerged.java new file mode 100644 index 0000000..274a887 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringMerged.java @@ -0,0 +1,92 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.HashSet; +import java.util.List; + +/** + * 两个集合映射组合算法 + * + */ +public class StringMerged { + + public static int N = 262144;//9组数据 + private static String[] resultArray = new String[262144]; + private static int itemSize = 4;//每次最大4个 + public static int index = 0; + private static HashSet sets = new HashSet<>(); + + public HashSet findAllKindSplice(String str) { + sets.clear();//每次都清理掉集合 + char[] chas = new char[itemSize]; + + char[] strArray = str.toCharArray(); + for (int i = 0; i < chas.length; i++) { + chas[i] = ' '; + if (i < str.length()) { + chas[i] = strArray[i]; + } + } + + int length = itemSize; + for (int i = 0; i < resultArray.length; i++) { + char chasValue = ' '; + if (index == 0) { + if (i < N / length) { + chasValue = chas[0]; + } else if (i < N / length * 2) { + chasValue = chas[1]; + } else if (i < N / length * 3) { + chasValue = chas[2]; + } else if (i < N) { + if (chas[3] != ' ') { + chasValue = chas[3]; + } else { +// chasValue = '*'; + } + } + } else { + if (i % getCount(N, index - 1) < getCount(N, index)) {//0~3 + chasValue = chas[0]; + } else if (i % getCount(N, index - 1) < getCount(N, index) * 2) { + chasValue = chas[1]; + } else if (i % getCount(N, index - 1) < getCount(N, index) * 3) { + chasValue = chas[2]; + } else if (i % getCount(N, index - 1) < getCount(N, index) * 4) { + if (chas[3] != ' ') { + chasValue = chas[3]; + } + } + } + + if (resultArray[i] != null && chasValue != ' ') { + resultArray[i] = resultArray[i] + chasValue; + } else { + if (chasValue != ' ') { + resultArray[i] = "" + chasValue; + } else { + resultArray[i] = ""; + } + } + //去掉多于元素,因为本次拼接长度一定比上次长 + if (resultArray[i].length() > index) { + sets.add(resultArray[i]); + } + } + + index++; +// return resultArray; + return sets; + } + + private static int getCount(int n, int index) { + if (index == 0) { + return n / itemSize; + } else { + return getCount(n / itemSize, --index); + } + } + + + + +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringMerged2.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringMerged2.java new file mode 100644 index 0000000..de97105 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringMerged2.java @@ -0,0 +1,94 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.ArrayList; +import java.util.List; + +/** + * 两个集合映射组合算法 + */ +public class StringMerged2 { + public static Node root = new Node(null, "", null); + + public static List currentNodeList = new ArrayList<>(); + + public static void main(String[] args) { + String str1 = "ABC"; + String str2 = "DEF"; + String str3 = "GHI"; + String str4 = "JKL"; + String str5 = "MNO"; + String str6 = "PQRS"; + String str7 = "TUVW"; + String str8 = "XYZ"; + findMerged(str1); + findMerged(str2); + findMerged(str3); + findMerged(str4); + findMerged(str5); + findMerged(str6); + findMerged(str7); + + System.out.println("start=" + System.currentTimeMillis()); + List results = findMerged(str8); + System.out.println("end=" + System.currentTimeMillis()); +// for (Leaf leaf : currentLeafList) { +// System.out.print(leaf.value + ","); +// } + + System.out.println("总结果数量:" + results.size()); +// for (String result : results) { +// System.out.print(result + ","); +// } + +// List results = findMerged(str1); + } + + public static List findMerged(String str) { + char chas[] = str.toCharArray(); + + if (currentNodeList.size() == 0) { + List list = new ArrayList<>(); + for (char cha : chas) { + list.add(new Node(root, String.valueOf(cha), null)); + } + currentNodeList = list; + } else { + List nodeList = new ArrayList<>();//底部叶子节点 + for (Node node : currentNodeList) { + List childList = new ArrayList<>();//创建每一个孩子集合 + for (char cha : chas) { + Node child = new Node(node, String.valueOf(cha), null); + childList.add(child); + nodeList.add(child); + } + node.childs = childList; + } + currentNodeList = nodeList; + } + + List results = new ArrayList<>(); + for (Node node : currentNodeList) { + String end = ""; + Node current = node; + while (current != null) { + end = current.value + end; + current = current.parent; + } + results.add(end); + } + return results; + } + + + static class Node { + public Node parent; + public String value; + public List childs; + + public Node(Node p, String value, List childs) { + this.parent = p; + this.childs = childs; + this.value = value; + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringMinIncludeStringLength.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringMinIncludeStringLength.java new file mode 100644 index 0000000..496bd40 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringMinIncludeStringLength.java @@ -0,0 +1,4 @@ +package com.wangpos.datastructure.algorithm; + +public class StringMinIncludeStringLength { +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringMinShortDistance.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringMinShortDistance.java new file mode 100644 index 0000000..52838d7 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringMinShortDistance.java @@ -0,0 +1,42 @@ +package com.wangpos.datastructure.algorithm; + +public class StringMinShortDistance { + + public static void main(String args[]) { + + String[] strings = new String[]{"1", "3", "3", "3", "2", "3", "1"}; + System.out.println(minDistance(strings, "2", "1")); + + } + + public static int minDistance(String[] strs, String str1, String str2) { + if (str1 == null || str2 == null) { + return -1; + } + if (str1.equals(str2)) { + return 0; + } + int last1 = -1; + int last2 = -1; + int min = Integer.MAX_VALUE; + for (int i = 0; i != strs.length; i++) { + if (strs[i].equals(str1)) { + if (last2 != -1) { + min = Math.min(min, i - last2); + } + last1 = i; + } + if (strs[i].equals(str2)) { + if (last1 != -1) { + min = Math.min(min, i - last1); + } + last2 = i; + } + } + + return min == Integer.MAX_VALUE ? -1 : min; + } + + //如果实现时间复杂度O(1),那么我们只能采用Hash表,因为两个参数,所以Value 还得用一个hash表 + //最后我们把这个表先生成就好了 +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringNewString.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringNewString.java new file mode 100644 index 0000000..c9c1362 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringNewString.java @@ -0,0 +1,4 @@ +package com.wangpos.datastructure.algorithm; + +public class StringNewString { +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringPerfectShuffleCard.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringPerfectShuffleCard.java new file mode 100644 index 0000000..2c801ca --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringPerfectShuffleCard.java @@ -0,0 +1,55 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.Arrays; + +public class StringPerfectShuffleCard { + public static int N; + public static char chas[]; + + public static void main(String args[]) { + String str = "12345678"; + chas = str.toCharArray(); + N = str.length() / 2; + System.out.println(shuffleCard(str)); + } + + public static String shuffleCard(String str) { + + for (int i = 1; i < N; ) { + int startIndex = i; + int curIndex = -1; + char currentValue = ' '; + while (curIndex != startIndex) { + if (curIndex == -1) { + curIndex = startIndex; + int nextIndex = getNextPosition(curIndex); + currentValue = chas[nextIndex]; + chas[nextIndex] = chas[curIndex]; + curIndex = nextIndex; + } else { + int nextIndex = getNextPosition(curIndex); + char nextValue = chas[nextIndex]; + chas[nextIndex] = currentValue; + currentValue = nextValue; + curIndex = nextIndex; + } + } + + i = i + 2; + } + + return Arrays.toString(chas); + } + + private static char getValue(int curIndex) { + return chas[curIndex]; + } + + public static int getNextPosition(int postion) { + if (postion < N) { + return 2 * postion; + } else { + return 2 * (postion - N) + 1; + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringReplace.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringReplace.java new file mode 100644 index 0000000..d39cc15 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringReplace.java @@ -0,0 +1,53 @@ +package com.wangpos.datastructure.algorithm; + +public class StringReplace { + + public static void main(String[] args) { + + + } + + public static void replace(char[] chas) { + if (chas == null || chas.length == 0) { + return; + } + int num = 0; + int len = 0; + for (len = 0; len < chas.length && chas[len] != 0; len++) { + if (chas[len] == ' ') { + num++; + } + } + + int j = len + num * 2 - 1; + for (int i = len - 1; i > -1; i--) { + if (chas[i] != ' ') { + chas[j--] = chas[i]; + } else { + chas[j--] = '0'; + chas[j--] = '2'; + chas[j--] = '%'; + } + } + } + + /** + * 有字符串的包含数组和* ,现在把星移动到所有数字前面 + * @param chas + */ + public void modify(char[]chas){ + + if(chas ==null ||chas.length==0){ + return; + } + int j = chas.length-1; + for(int i= chas.length-1;i>-1;i--){ + if(chas[i]!='*'){ + chas[j--] = chas[i]; + } + } + for(;j>-1;){ + chas[j--] = '*'; + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringReverse.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringReverse.java new file mode 100644 index 0000000..31bb719 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringReverse.java @@ -0,0 +1,89 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.Arrays; + +public class StringReverse { + + + public static void main(String[] args) { + + String str = "I love you"; + + String result = getReverse2(str); + System.out.println(result); + + } + + //通过char 数组事项 + private static String getReverse(String str) { + char[] chas = str.toCharArray(); + int start = 0; + int end = chas.length - 1; + /** + * 实现思路 先全部反转,然后再局部反转 + */ + reverse(chas, start, end); + + int l = -1; + int r = -1; + for (int i = 0; i < chas.length; i++) { + if (chas[i] != ' ') { + //找到l + if (i == 0 || chas[i - 1] == ' ') { + l = i; + } + //找到每一个r + if (i == chas.length - 1 || chas[i + 1] == ' ') { + r = i; + } + } + if (l != -1 && r != -1) { + reverse(chas, l, r); + l = -1; + r = -1; + } + } + + return Arrays.toString(chas); + } + + //通过String 数组也可以实现,但是会产生临时对象 + private static String getReverse2(String str) { + String strArray[] = str.split(" "); + + int start = 0; + int end = strArray.length - 1; + String tmp = ""; + while (start < end) { + tmp = strArray[start]; + strArray[start] = strArray[end]; + strArray[end] = tmp; + start++; + end--; + } + + String result = "";//StringBuilder + for (int i = 0; i < strArray.length; i++) { + if (i == strArray.length - 1) { + result = result+strArray[i]; + } else { + result = result + strArray[i] + " "; + } + + } + return result; + } + + + public static void reverse(char[] chas, int start, int end) { + char tmp = 0; + while (start < end) { + tmp = chas[start]; + chas[start] = chas[end]; + chas[end] = tmp; + start++; + end--; + } + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringRotateChange.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringRotateChange.java new file mode 100644 index 0000000..843a897 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringRotateChange.java @@ -0,0 +1,52 @@ +package com.wangpos.datastructure.algorithm; + + +/** + * 旋转字符串 + *

+ *

+ */ +public class StringRotateChange { + + public static void main(String[] args) { + + String s1 = "abcd"; + String s2 = "dbac";//true + + System.out.println("是否是旋转串=" + isRotateString(s1, s2)); + + String s3 = "abcd"; + String s4 = "cadb";//false + + System.out.println("是否是旋转串=" + isRotateString(s3, s4)); + } + + public static boolean isRotateString(String s1, String s2) { + if (s1 == null || s2 == null || s1.length() == 0 || s2.length() == 0 || s1.length() != s2.length()) { + return false; + } + if (s1 == s2) { + return true; + } + + char[] chas1 = s1.toCharArray(); + char[] chas2 = s2.toCharArray(); + + /** + * 从上向下比较 + */ + int start = 0; + int end = chas2.length-1; + for (int i = chas1.length-1; i >0; i--) { + if (chas1[i] != chas2[end]) { + if (chas1[i] != chas2[start]) { + return false; + } else { + start++; + } + } + } + + return true; + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringSingleChar.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringSingleChar.java new file mode 100644 index 0000000..142dbe9 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringSingleChar.java @@ -0,0 +1,108 @@ +package com.wangpos.datastructure.algorithm; + +public class StringSingleChar { + + public static void main(String[] args) { + String testStr1 = "aaabbb"; + String testStr2 = "abcd"; + + System.out.println(isSingleCharString(testStr1)); + System.out.println(isSingleCharString(testStr2)); + + System.out.println(isUnique2(testStr1.toCharArray())); + System.out.println(isUnique2(testStr2.toCharArray())); + } + + // O (n) + public static boolean isSingleCharString(String str) { + char[] chars = str.toCharArray(); + int[] counts = new int[256]; + for (char aChar : chars) { + if (counts[aChar] > 0) { + return false; + } + counts[aChar]++; + } + return true; + } + + // 要求空间复杂度O 1 + /** + * 所有O(n)时间复杂度的排序算法(桶排序,基数排序,计数排序)都需要额外空间排序,所以空间复杂度不是O(1) + * 那么看O(nlogn)时间复杂度算法 (归并排序,快速排序,希尔排序,堆排序) + * 归并排序中有连个数组合并成一个数组过程,这个过程需要辅助数组来完成 + * 快速排序额外空间复杂度最低 logN + * 希尔排序同样也排除,因为他的时间复杂度不固定,最低N*N,取决于步长 + * 堆排序 可以时间复杂度能稳定O(NlogN) 并且空间复杂度是O(1),但是要使用非递归实现 + * 否则会浪费函数栈空间 + * + * @param chas + * @return + */ + //堆排序 O(nlogn) 空间复杂度O(1) + public static boolean isUnique2(char[] chas) { + + if (chas == null) { + return true; + } + heapSort(chas); + for (int i = 1; i < chas.length; i++) { + if (chas[i] == chas[i - 1]) { + return false; + } + } + return true; + } + + public static void heapSort(char[] chas) { + for (int i = 0; i < chas.length; i++) { + heapInsert(chas, i); + } + for (int i = chas.length - 1; i > 0; i--) { + swap(chas, 0, i); + heapify(chas, 0, i); + } + } + + public static void heapify(char[] chas, int i, int size) { + int left = i * 2 + 1; + int right = i * 2 + 2; + int largest = i; + while ((left < size)) { + if (chas[left] > chas[i]) { + largest = left; + } + if (right < size && chas[right] > chas[largest]) { + largest = right; + } + if (largest != i) { + swap(chas, largest, i); + } else { + break; + } + i = largest; + left = i * 2 + 1; + right = i * 2 + 2; + } + } + + public static void heapInsert(char[] chas, int i) { + int parent = 0; + while (i != 0) { + + parent = (i - 1) / 2; + if (chas[parent] < chas[i]) { + swap(chas, parent, i); + i = parent; + } else { + break; + } + } + } + + public static void swap(char[] chas, int index1, int index2) { + char tmp = chas[index1]; + chas[index1] = chas[index2]; + chas[index2] = tmp; + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringToDiKaEr.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringToDiKaEr.java new file mode 100644 index 0000000..8aa4262 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringToDiKaEr.java @@ -0,0 +1,103 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.ArrayList; +import java.util.List; + +public class StringToDiKaEr { + + + public static void main(String[] args) { + List> list = new ArrayList>(); + List listSub1 = new ArrayList(); + List listSub2 = new ArrayList(); + List listSub3 = new ArrayList(); + List listSub4 = new ArrayList(); + List listSub5 = new ArrayList(); + List listSub6 = new ArrayList(); + List listSub7 = new ArrayList(); + List listSub8 = new ArrayList(); + listSub1.add("A"); + listSub1.add("B"); + listSub1.add("C"); + + listSub2.add("D"); + listSub2.add("E"); + listSub2.add("F"); + + listSub3.add("G"); + listSub3.add("H"); + listSub3.add("I"); + + listSub4.add("J"); + listSub4.add("K"); + listSub4.add("L"); + + listSub5.add("M"); + listSub5.add("N"); + listSub5.add("O"); + + listSub6.add("P"); + listSub6.add("Q"); + listSub6.add("R"); + + listSub7.add("S"); + listSub7.add("T"); + listSub7.add("U"); + + listSub8.add("V"); + listSub8.add("W"); + listSub8.add("X"); + + + list.add(listSub1); + list.add(listSub2); + list.add(listSub3); + list.add(listSub4); + list.add(listSub5); + list.add(listSub6); + list.add(listSub7); + list.add(listSub8); + + System.out.println("start:"+System.currentTimeMillis()); + List> result = new ArrayList>(); + descartes(list, result, 0, new ArrayList()); + System.out.println("end:"+System.currentTimeMillis()); + } + /** + * Created on 2014年4月27日 + *

+ * Discription:笛卡尔乘积算法 + * 把一个List{[1,2],[3,4],[a,b]}转化成List{[1,3,a],[1,3,b],[1,4 + * ,a],[1,4,b],[2,3,a],[2,3,b],[2,4,a],[2,4,b]}数组输出 + *

+ * + * @param layer + * 中间参数 + * @param curList + * 中间参数 + */ + private static void descartes(List> dimvalue, + List> result, int layer, List curList) { + if (layer < dimvalue.size() - 1) { + if (dimvalue.get(layer).size() == 0) { + descartes(dimvalue, result, layer + 1, curList); + } else { + for (int i = 0; i < dimvalue.get(layer).size(); i++) { + List list = new ArrayList(curList); + list.add(dimvalue.get(layer).get(i)); + descartes(dimvalue, result, layer + 1, list); + } + } + } else if (layer == dimvalue.size() - 1) { + if (dimvalue.get(layer).size() == 0) { + result.add(curList); + } else { + for (int i = 0; i < dimvalue.get(layer).size(); i++) { + List list = new ArrayList(curList); + list.add(dimvalue.get(layer).get(i)); + result.add(list); + } + } + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringToInt.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringToInt.java new file mode 100644 index 0000000..baf9199 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringToInt.java @@ -0,0 +1,82 @@ +package com.wangpos.datastructure.algorithm; + +public class StringToInt { + + public static void main(String[] args) { + + String str = "-123"; + String str2 = "a2342"; + String str3 = "02342"; + int result = convert(str); + + System.out.println(result); + } + + /** + * 检测是否是数字字符 + * + * @param chas + * @return + */ + public static boolean isValid(char[] chas) { + //判断第一位是0到9的之外的数,而不是负号 + if (chas[0] != '-' && (chas[0] < '0' || chas[0] > '9')) { + return false; + } + //如果第一位为负号,后面的不可以是0 也不能没有值 + if (chas[0] == '-' && (chas.length == 1 || chas[1] == '0')) { + return false; + } + //第一位是0 但是长度大于1 false + if (chas[0] == '0' && chas.length > 1) { + return false; + } + + //第二位以后是0 到9的数 + for (int i = 1; i < chas.length; i++) { + if (chas[i] < '0' || chas[i] > '9') { + return false; + } + } + return true; + } + + public static int convert(String str) { + if (str == null || str.equals("")) { + return 0;//不能转 + } + char[] chas = str.toCharArray(); + if (!isValid(chas)) { + return 0;//不符合要求 + } + + //判断正负数 + boolean posi = chas[0] != '-'; + int minq = Integer.MIN_VALUE / 10; + int minr = Integer.MAX_VALUE % 10; + int res = 0; + int cur = 0; + //-2147483648 2147483647 + // + //左程云. 程序员代码面试指南IT名企算法与数据结构题目最优解(第2版) (Chinese Edition) (Kindle位置3654). Kindle 版本. + // + //左程云. 程序员代码面试指南IT名企算法与数据结构题目最优解(第2版) (Chinese Edition) (Kindle位置3654). Kindle 版本. + //以负数进行计算 比如 + // 123 第一次 -1 res = 0*10 -1 =-1 小于12 + // 第二次 res = -1*10 -2 = -12 小于12 如果大于直接溢出,不管下一位是什么 + // 第三次 res = -12*10 -3 = -123 如果等于 就比较最后一个值 + for (int i = posi ? 0 : 1; i < chas.length; i++) { + cur = '0' - chas[i];//当前字符所代表的负数形式 + if ((res < minq) || (res == minq && cur < minr)) { + return 0; + } + res = res * 10 + cur; + + } + //判断正数最大值 + if (posi && res == Integer.MIN_VALUE) { + return 0;//不能转 + } + return posi ? -res : res; + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringToStatisticsString.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringToStatisticsString.java new file mode 100644 index 0000000..39638a9 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringToStatisticsString.java @@ -0,0 +1,39 @@ +package com.wangpos.datastructure.algorithm; + +public class StringToStatisticsString { + + + public static void main(String[] args) { + + String target = "aaabbbbbccc3333cccdee"; + + String result = getCountString(target); + + System.out.println(result); + + } + + public static String getCountString(String str) { + + char[] chs = str.toCharArray(); + String res = String.valueOf(chs[0]); + + int num = 1; + + for (int i = 1; i < chs.length; i++) { + if (chs[i] != chs[i - 1]) { + res = contact(res,String.valueOf(num),String.valueOf(chs[i])); + num = 1; + }else{ + num++; + } + } + return contact(res,String.valueOf(num),""); + } + + //统计字符串用_分割开,可以区分里面含数字的情况 + public static String contact(String s1,String s2,String s3){ + return s1+"_"+s2+(s3.equals("")?s3:"_"+s3); + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/StringToStringMinDistance.java b/app/src/main/java/com/wangpos/datastructure/algorithm/StringToStringMinDistance.java new file mode 100644 index 0000000..415e87f --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/StringToStringMinDistance.java @@ -0,0 +1,118 @@ +package com.wangpos.datastructure.algorithm; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.Set; + +public class StringToStringMinDistance { + + public static void main(String[] args) { + + String start = "adc"; + String to = "cab"; + List words = new ArrayList<>(); + words.add("cab"); + words.add("acc"); + words.add("cbc"); + words.add("ccc"); + words.add("cac"); + words.add("cbb"); + words.add("aab"); + words.add("abb"); + + List> list = findMinPaths(start, to, words); + + for (List strings : list) { + for (String str:strings){ + System.out.print(" "+str+" "); + } + System.out.println(); + } + } + + public static List> findMinPaths(String start, String to, List list) { + list.add(start); + HashMap> nexts = getNexts(list); + HashMap distances = getDistance(start, nexts); + LinkedList pathList = new LinkedList<>(); + List> res = new ArrayList<>(); + getShortestPaths(start, to, nexts, distances, pathList, res); + return res; + } + + private static void getShortestPaths(String cur, String to, HashMap> nexts, + HashMap distances, LinkedList solution, + List> res) { + solution.add(cur); + if (to.equals(cur)) { + res.add(new LinkedList(solution)); + } else { + for (String next : nexts.get(cur)) { + if (distances.get(next) == distances.get(cur) + 1) { + getShortestPaths(next, to, nexts, distances, solution, res); + } + } + } + solution.pollLast(); + } + + + public static HashMap getDistance(String start, HashMap> nexts) { + HashMap distances = new HashMap<>(); + distances.put(start, 0); + Queue queue = new LinkedList(); + queue.add(start); + HashSet set = new HashSet<>(); + set.add(start); + while (!queue.isEmpty()) { + String cur = queue.poll(); + for (String str : nexts.get(cur)) { + if (!set.contains(str)) { + distances.put(str, distances.get(cur) + 1); + queue.add(str); + set.add(str); + } + } + } + + return distances; + } + + public static HashMap> getNexts(List words) { + Set dict = new HashSet<>(words); + + HashMap> nexts = new HashMap<>(); + for (int i = 0; i < words.size(); i++) { + nexts.put(words.get(i), new ArrayList()); + } + for (int i = 0; i < words.size(); i++) { + nexts.put(words.get(i), getNext(words.get(i), dict)); + } + return nexts; + } + + private static ArrayList getNext(String word, Set dict) { + ArrayList res = new ArrayList<>(); + char[] chs = word.toCharArray(); + for (char cur = 'a'; cur <= 'z'; cur++) { + for (int i = 0; i < chs.length; i++) { + if (chs[i] != cur) { + char tmp = chs[i]; + + chs[i] = cur; //替换 + if (dict.contains(String.valueOf(chs))) { + res.add(String.valueOf(chs)); + } + chs[i] = tmp; //替换回来 + } + } + } + return res; + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/algorithm/TestStringMerged.java b/app/src/main/java/com/wangpos/datastructure/algorithm/TestStringMerged.java new file mode 100644 index 0000000..cadf3b7 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/algorithm/TestStringMerged.java @@ -0,0 +1,54 @@ +package com.wangpos.datastructure.algorithm; + +import java.util.HashMap; +import java.util.HashSet; + +public class TestStringMerged { + + public static void main(String[] args) { + + String str1 = "ABCD"; + + String str2 = "EFGH"; + + String str3 = "IJK"; + + String str4 = "LMN"; + + String str5 = "OPQ"; + + String str6 = "RST"; + + String str7 = "UVW"; + + String str8 = "XYZ"; + + StringMerged sm = new StringMerged(); + + sm.findAllKindSplice(str1); + sm.findAllKindSplice(str2); + sm.findAllKindSplice(str3); + sm.findAllKindSplice(str4); + sm.findAllKindSplice(str5); + sm.findAllKindSplice(str6); + sm.findAllKindSplice(str7); + System.out.println("startTime " + System.currentTimeMillis()); + HashSet resultSet = sm.findAllKindSplice(str8); + System.out.println("endTime " + System.currentTimeMillis()); + + +// for (String s : resultArray) { +// System.out.print(s + " "); +// } + + System.out.println(); +// System.out.println("______________________"); +//// + System.out.println("种类" + resultSet.size()); +// for (String s : resultSet) { +// System.out.print(s + " "); +// } + + + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/base/ArrayTest.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/ArrayTest.kt similarity index 92% rename from app/src/main/java/com/wangpos/datastructure/base/ArrayTest.kt rename to app/src/main/java/com/wangpos/datastructure/leetcode/ArrayTest.kt index dd1868c..20e4d74 100644 --- a/app/src/main/java/com/wangpos/datastructure/base/ArrayTest.kt +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/ArrayTest.kt @@ -1,7 +1,4 @@ -package com.wangpos.datastructure.base - -import com.wangpos.datastructure.algorithm.swap -import java.util.* +package com.wangpos.datastructure.leetcode /** diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1.kt new file mode 100644 index 0000000..772d021 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1.kt @@ -0,0 +1,39 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + + +/** + * 两数之和 + * + * 暴力方法时间复杂度是O(n2) + * + * 也可以通过hash表降低查找时间,使其变成O(n),使用hash表注意给定数组中不能出现重复元素 + */ + +fun main() { + val nums = arrayOf(1, 2, 3, 4, 5, 6) + val target = 9 + val resultArray = twoSum(nums, target) + println("结果:${Arrays.toString(resultArray)}") +} + +/** + * 这种方法找不到所有的元素,只能找到一个,当存在里面有重复元素或不止一种情况 + */ +fun twoSum(nums: Array, target: Int): IntArray { + // 一个hashMap存一个value 和position + val map = mutableMapOf() + for (i in 0 until nums.size) { + val targetData = target - nums[i] + if (map.containsKey(targetData)) { + val resultArray = IntArray(2) + resultArray[0] = map[targetData]!! + resultArray[1] = i + return resultArray + } + map.put(nums[i], i) + } + throw IllegalArgumentException("No two sum solution") +} + diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1038.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1038.kt new file mode 100644 index 0000000..52c09ab --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1038.kt @@ -0,0 +1,100 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + +/** + * 二叉查找树(英语:Binary Search Tree),也称为 二叉搜索树、有序二叉树(Ordered Binary Tree)或排序二叉树(Sorted Binary Tree),是指一棵空树或者具有下列性质的二叉树: + +若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; +若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值; +任意节点的左、右子树也分别为二叉查找树; +没有键值相等的节点。 +二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为 O(\log n)O(logn)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。 + +二叉查找树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉查找树的存储结构。中序遍历二叉查找树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉查找树变成一个有序序列,构造树的过程即为对无序序列进行查找的过程。每次插入的新的结点都是二叉查找树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索、插入、删除的复杂度等于树高,期望 O(\log n)O(logn),最坏 O(n)O(n)(数列有序,树退化成线性表)。 + + + +虽然二叉查找树的最坏效率是 O(n)O(n),但它支持动态查询,且有很多改进版的二叉查找树可以使树高为 O(\log n)O(logn),从而将最坏效率降至 O(\log n)O(logn),如 AVL 树、红黑树等。 + + */ +fun main() { + + //右左根的遍历方式 + //记忆搜索 + + //不存在相等的元素 + val arrayNode = arrayOf(4, 1, 6, 0, 2, 5, 7, null, null, null, 3, null, null, null, 8) +// val arrayNode = arrayOf( 6, 5, 7, 8) + var head: TreeNode? = null + arrayNode.forEach { + if (it != null) { + if (head == null) { + head = TreeNode(it) + } else { + createBinearySearchTree(head!!, it!!) + } + } + } + //打出中序遍历结果判断访问是否正确 + head?.let { printNode(it) } + + println() + head?.let { modifyNode(it) } + println() + + + println() + head?.let { printNode(it) } + +} + +fun createBinearySearchTree(head: TreeNode, it: Int) { + + var next: TreeNode? = null + if (it > head.`val`) { + next = head.right + if (next == null) { + head.right = TreeNode(it) + return + } + } else { + next = head.left + if (next == null) { + head.left = TreeNode(it) + return + } + } + + createBinearySearchTree(next, it) + +} + +//中序遍历左跟右 +fun printNode(head: TreeNode) { + head.left?.let { printNode(it) } + print(" ${head.`val`} ") + head.right?.let { printNode(it) } +} + + + +var cacheTotal = 0 +//右 根 左 把每个节点和队列之前的计算和添加到队列, +fun modifyNode(root: TreeNode) { + root.right?.let { modifyNode(it) } + print(" ${root.`val`} ") + if (cacheTotal==0) { + cacheTotal = root.`val` + + } else { + cacheTotal += root.`val` + root.`val` = cacheTotal + } + root.left?.let { modifyNode(it) } +} + +class TreeNode(var `val`: Int) { + var left: TreeNode? = null + var right: TreeNode? = null +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1203.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1203.java new file mode 100644 index 0000000..8954932 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1203.java @@ -0,0 +1,246 @@ +package com.wangpos.datastructure.leetcode; + +import android.support.annotation.NonNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + * + * 项目之间的依赖关系,用拓扑排序解决。这比较明显。 + * + * 难点在于怎么理解“ 同一小组的项目,排序后在列表中彼此相邻 ”。 + * + * + * 这个题通过提示可以知道使用两层拓扑排序,但是坑还是挺多的。 + * 1.需要给单独的项目创建一个组 + * 2.需要通过项目ID找到关联的组,同时需要维护组本身的序列 + * 一开始想图省事,用一个group[]表示,后来发现这样有耦合问题。改用List维护组本身,用数组维护项目到组的映射关系,初始化List为m个,如果遇到单独的项目, + * 则把当前List大小设置为组ID分配给这个项目。通过这个解决了项目ID和组ID耦合的问题。 + * + */ +public class LeetCode1203 { + + public static void main(String args[]) { + int[] group = new int[]{-1, -1, 1, 0, 0, 1, 0, -1}; + int n = 8; + int m = 2; + List> beforeItems = new ArrayList<>(); + //[[],[6],[5],[6],[3,6],[],[],[]] + beforeItems.add(createItem()); + beforeItems.add(createItem()); + beforeItems.get(beforeItems.size() - 1).add(6); + beforeItems.add(createItem()); + beforeItems.get(beforeItems.size() - 1).add(5); + beforeItems.add(createItem()); + beforeItems.get(beforeItems.size() - 1).add(6); + beforeItems.add(createItem()); + beforeItems.get(beforeItems.size() - 1).add(3); + beforeItems.get(beforeItems.size() - 1).add(6); + beforeItems.add(createItem()); + beforeItems.add(createItem()); + beforeItems.add(createItem()); + + int[] result = new LeetCode1203().sortItems(8, 2, group, beforeItems); + System.out.println(Arrays.toString(result)); + + } + + @NonNull + private static List createItem() { + return new ArrayList(); + } + + + Listqueue = new LinkedList<>(); + + + //项目 + static class Item { + //项目id + int id; + + //初始化入度 + int inputCnt; + //下一个项目 + List nextItems = new ArrayList<>(); + + Item(int id) { + this.id = id; + } + } + + //组 + static class Group { + //组id + int id; + + //入度 + int inputCnt; + + List items = new ArrayList<>(); + //下一个 组 + List nextGroups = new ArrayList<>(); + + Group(int id) { + this.id = id; + } + } + + /** + * 使用邻接表的形式 + * @param n + * @param m + * @param group + * @param beforeItems + * @return + */ + public int[] sortItems(int n, int m, int[] group, List> beforeItems) { + //项目数组 + Item[] items = new Item[n]; + + //用来保存已经绑定过item的group数组 + Group[] itemToGroup = new Group[n]; + + //组 + List oriGroups = new ArrayList<>(); + + //初始化组种类 + for (int j = 0; j < m; j++) { + oriGroups.add(new Group(j)); + } + + //初始化项目 + for (int i = 0; i < n; i++) { + items[i] = new Item(i); + } + + /** + * 遍历每个项目,所属组 + */ + for (int i = 0; i < group.length; i++) { + int groupId = group[i]; + if (groupId == -1) {// 项目不属于任何组 + //创建一个新组 + Group temp = new Group(oriGroups.size()); + //保存到组列表 + oriGroups.add(temp); + //组绑定这个项目,因为项目是按顺序的所以i就是这个项目 + temp.items.add(i); + itemToGroup[i] = temp; + } else { + //根据组id 绑定项目 + oriGroups.get(groupId).items.add(i); + itemToGroup[i] = oriGroups.get(groupId); + } + } + + for (int i = 0; i < beforeItems.size(); i++) { + List array = beforeItems.get(i); + //初始化入度 + items[i].inputCnt = array.size(); + for (Integer itemId : array) { + //每个项目的下一个项目 + items[itemId].nextItems.add(i); + //获取绑定项目后的组 + Group beforeGroup = itemToGroup[itemId]; + //当前组 + Group curGroup = itemToGroup[i]; + if (beforeGroup != curGroup) { + //前一个组保存他的下一个组 + beforeGroup.nextGroups.add(curGroup); + //当前组入度多1 + curGroup.inputCnt++; + } + } + } + + Queue groupQueue = new LinkedList<>(); + + //找到入度为0的组添加到待遍历的队列中 + for (Group ele : oriGroups) { + if (ele.inputCnt == 0) { + groupQueue.offer(ele); + } + } + + if (groupQueue.isEmpty()) { + return new int[0]; + } + + int[] result = new int[n]; + int resultIndex = 0; + while (!groupQueue.isEmpty()) { + int size = groupQueue.size(); + for (int i = 0; i < size; i++) { + Group curGroup = groupQueue.poll(); + Queue itemQueue = new LinkedList<>(); + if (curGroup.items.isEmpty()) { + continue; + } + + //再进行item拓扑排序 + for (int temp : curGroup.items) { + if (items[temp].inputCnt == 0) { + itemQueue.offer(temp); + } + } + + if (itemQueue.isEmpty()) { + return new int[0]; + } + + // + while (!itemQueue.isEmpty()) { + int itemQueueSize = itemQueue.size(); + for (int j = 0; j < itemQueueSize; j++) { + Integer itemId = itemQueue.poll(); + //保存结果 + result[resultIndex++] = itemId; + //遍历下一个 + for (int nextItemId : items[itemId].nextItems) { + items[nextItemId].inputCnt--; + if (items[nextItemId].inputCnt == 0 && curGroup.items.contains(nextItemId)) { + itemQueue.offer(nextItemId); + } + } + } + } + + //项目中存在环 + for (int itemId : curGroup.items) { + if (items[itemId].inputCnt > 0) { + return new int[0]; + } + } + + //遍历下一个组 + for (Group nextGroup : curGroup.nextGroups) { + nextGroup.inputCnt--; + if (nextGroup.inputCnt == 0) { + groupQueue.offer(nextGroup); + } + } + } + } + //组中存在环 + for (Group ele : oriGroups) { + if (ele.inputCnt > 0) { + return new int[0]; + } + } + + for (int k = 0; k < items.length; k++) { + if (items[k].inputCnt > 0) { + return new int[0]; + } + } + + return result; + } + + +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1214.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1214.java new file mode 100644 index 0000000..65e3b74 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1214.java @@ -0,0 +1,101 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.Stack; + +public class LeetCode1214 { + + public boolean twoSumBSTs(TreeNode root1, TreeNode root2, int target) { + + Stack stack1 = new Stack<>(); + Stack stack2 = new Stack<>(); + searchRoot11(root1, stack1); + searchRoot22(root2, stack2); + int t = 0; + int small = stack1.pop(); + int large = stack2.pop(); + while (!stack1.empty() || !stack2.empty()) { + t = small + large; + if (t == target) { + return true; + } else if (t > target) { + // 取较小的 + if(!stack1.empty()) { + small = stack1.pop(); + }else{ + break; + } + } else { + // 取较大的 + if(!stack2.empty()) { + large = stack2.pop(); + }else{ + break; + } + } + } + return false; + } + + private void searchRoot11(TreeNode root1, Stack stack) { + if (root1 == null) { + return; + } + searchRoot11(root1.getLeft(), stack); + stack.add(root1.getVal()); + searchRoot11(root1.getRight(), stack); + } + + private void searchRoot22(TreeNode root1, Stack stack) { + + if (root1 == null) { + return; + } + searchRoot22(root1.getRight(), stack); + stack.add(root1.getVal()); + searchRoot22(root1.getLeft(), stack); + } +// +// fun twoSumBSTs2(root1: TreeNode?, root2: TreeNode?, target: Int): Boolean { +// +// val stack1 = Stack()//从小到大 top最大 +// val stack2 = Stack()//从大到小 +// searchRoot11(root1, stack1) +// searchRoot22(root2, stack2) +// var t = 0 +// var small = stack1.pop() +// var large = stack2.pop() +// while (stack1.isNotEmpty() && stack2.isNotEmpty()) { +// t = small + large +// println(small) +// println(large) +// if (t == target) { +// return true +// } else if (t > target) { +// // 取较小的 +// small = stack1.pop() +// } else { +// // 取较大的 +// large = stack2.pop() +// } +// } +// return false +// } +// +// fun searchRoot11(root1: TreeNode?, stack: Stack) { +// if (root1 == null) { +// return +// } +// searchRoot11(root1.left, stack) +// stack.add(root1.`val`) +// searchRoot11(root1.right, stack) +// } +// +// fun searchRoot22(root2: TreeNode?, stack: Stack) { +// if (root2 == null) { +// return +// } +// searchRoot22(root2.right, stack) +// stack.add(root2.`val`) +// searchRoot22(root2.left, stack) +// } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1214.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1214.kt new file mode 100644 index 0000000..8cbc305 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1214.kt @@ -0,0 +1,138 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + +fun main() { + + val root1Array = arrayOf(0, -10, 10) + + val root2Array = arrayOf(5, 1, 7, 0, 2) + + val target = 18 + + var root1: TreeNode? = null + var root2: TreeNode? = null + root1Array.forEach { + if (it != null) { + if (root1 == null) { + root1 = TreeNode(it) + } else { + createBinearySearchTree(root1!!, it!!) + } + } + } + + root2Array.forEach { + if (it != null) { + if (root2 == null) { + root2 = TreeNode(it) + } else { + createBinearySearchTree(root2!!, it!!) + } + } + } + +// root1?.let { printNode(it) } +// println() +// root2?.let { printNode(it) } + +// val result = twoSumBSTs(root1, root2, target) + +// val result = twoSumBSTs2(root1, root2, target) + val result = LeetCode1214().twoSumBSTs(root1,root2,target); + println("结果:${result}") +} + +/** + * 这种双层嵌套效率比较低,中序遍历时间复杂度是O(n) 后面的查找属于也是中序遍历所以O(n*n) + * + */ +fun twoSumBSTs(root1: TreeNode?, root2: TreeNode?, target: Int): Boolean { + searchRoot1(root1, root2, target) + return searchResult +} + +fun searchRoot1(root1: TreeNode?, root2: TreeNode?, target: Int) { + + if (root1 == null || searchResult) { + return + } + searchRoot1(root1?.left, root2, target) + if (root1.`val` > target) { + return + } + searchRoot2(root2, target - root1.`val`) + searchRoot1(root1?.right, root2, target) +} + +var searchResult = false +fun searchRoot2(root2: TreeNode?, i: Int) { + if (root2 == null || searchResult) { + return + } + searchRoot2(root2.left, i) + if (root2.`val` == i) { + searchResult = true + return + } + if (root2.`val` > i) { + return + } + searchRoot2(root2.right, i) +} + +/** + * 将两个树进行中序遍历,和逆向中序,时间复杂度 O(n)*2 + * 然后放入两个栈中,得到两个一个从小到大,一个从大到小的 + * + * 然后遍历两个栈,如果相加之和小于t,就从最小的栈去继续找,反之从大的栈中找 + * + * + */ +fun twoSumBSTs2(root1: TreeNode?, root2: TreeNode?, target: Int): Boolean { + + val stack1 = Stack()//从小到大 top最大 + val stack2 = Stack()//从大到小 + searchRoot11(root1, stack1) + searchRoot22(root2, stack2) + var t = 0 + var small = stack1.pop() + var large = stack2.pop() + while (stack1.isNotEmpty() || stack2.isNotEmpty()) { + t = small + large + println(small) + println(large) + if (t == target) { + return true + } else if (t > target) { + // 取较小的 + if(stack1.isNotEmpty()) { + small = stack1.pop() + } + } else { + // 取较大的 + if(stack1.isNotEmpty()) { + large = stack2.pop() + } + } + } + return false +} + +fun searchRoot11(root1: TreeNode?, stack: Stack) { + if (root1 == null) { + return + } + searchRoot11(root1.left, stack) + stack.add(root1.`val`) + searchRoot11(root1.right, stack) +} + +fun searchRoot22(root2: TreeNode?, stack: Stack) { + if (root2 == null) { + return + } + searchRoot22(root2.right, stack) + stack.add(root2.`val`) + searchRoot22(root2.left, stack) +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1272.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1272.java new file mode 100644 index 0000000..cf64245 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode1272.java @@ -0,0 +1,139 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +/** + * 给你一个 有序的 不相交区间列表 intervals 和一个要删除的区间 toBeRemoved, intervals 中的每一个区间 intervals[i] = [a, b] 都表示满足 a <= x < b 的所有实数  x 的集合。 + * + * 我们将 intervals 中任意区间与 toBeRemoved 有交集的部分都删除。 + * + * 返回删除所有交集区间后, intervals 剩余部分的 有序 列表。 + * + * + * 示例 1: + * + * 输入:intervals = [[0,2],[3,4],[5,7]], toBeRemoved = [1,6] + * 输出:[[0,1],[6,7]] + * 示例 2: + * + * 输入:intervals = [[0,5]], toBeRemoved = [2,3] + * 输出:[[0,2],[3,5]] + * + */ +public class LeetCode1272 { + + public static void main(String[] args) { + LeetCode1272 testObject = new LeetCode1272(); +// int[][] nums = new int[][]{new int[]{3, 4}, new int[]{0, 3}, new int[]{0, 2}, new int[]{5, 7}}; +// int[] toBeRemoved = new int[]{1, 6}; + +// int[][] nums = new int[][]{new int[]{0, 5}}; +// int[] toBeRemoved = new int[]{2, 3}; + +// int[][] nums = new int[][]{new int[]{-5, -4}, new int[]{-3, -2}, new int[]{1, 2}, new int[]{3, 5},new int[]{8,9}}; +// int[] toBeRemoved = new int[]{-1, 4}; + + int[][] nums = new int[][]{new int[]{0, 100}}; + int[] toBeRemoved = new int[]{0, 50}; + testObject.removeInterval(nums, toBeRemoved); + } + + public List> removeInterval(int[][] intervals, int[] toBeRemoved) { + + //排序分别比较两个条件,按顺序比较 + sortArray(intervals, new int[]{0, 1}); + + /** + * + * 0 2 0 3 3 4 5 7 + * 1 6 + * + * 0 1 6 7 + * + */ + + + List> result = new ArrayList<>(); + int[] lastSaveArray = null; + for (int[] interval : intervals) { + if (interval[0] <= toBeRemoved[0]) { + if (interval[1] > toBeRemoved[0]) { + //修改 入队列 + + int backupDataRight = interval[1]; + if (interval[0] != toBeRemoved[0]) { + interval[1] = toBeRemoved[0]; + + if (lastSaveArray == null) { + lastSaveArray = saveResult(result, interval); + } else if (lastSaveArray[0] == interval[0] && lastSaveArray[1] == interval[1]) { + continue; + } else { + lastSaveArray = saveResult(result, interval); + } + + } + + if (backupDataRight >= toBeRemoved[1]) { + int newArray[] = new int[]{toBeRemoved[1], backupDataRight}; + lastSaveArray = saveResult(result, newArray); + } + + } else { + lastSaveArray = saveResult(result, interval); + } + } else { + // 8 9 -1 4 + // + if (interval[1] <= toBeRemoved[1]) { + // 8 9 1 10 + //重复空间 +// lastSaveArray = saveResult(result, interval); + } else { + if (interval[0] <= toBeRemoved[1]) { + interval[0] = toBeRemoved[1]; + } + lastSaveArray = saveResult(result, interval); + } + } + } + + + return result; + } + + private int[] saveResult(List> result, int[] interval) { + int[] lastSaveArray; + lastSaveArray = interval; + List cell = new ArrayList(); + cell.add(interval[0]); + cell.add(interval[1]); + result.add(cell); + return lastSaveArray; + } + + private void sortArray(int[][] intervals, final int[] order) { + Arrays.sort(intervals, new Comparator() { + @Override + public int compare(Object o1, Object o2) { + int[] one = (int[]) o1; + int[] two = (int[]) o2; + + for (int i = 0; i < order.length; i++) { + int k = order[i]; + if (one[k] > two[k]) { + return 1; + } else if (one[k] < two[k]) { + return -1; + } else { + continue; //如果按一条件比较结果相等,就使用第二个条件进行比较。 + } + } + return 0; + } + }); + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode2.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode2.kt new file mode 100644 index 0000000..094e756 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode2.kt @@ -0,0 +1,76 @@ +package com.wangpos.datastructure.leetcode + +/** + * + * + */ +fun main() { + + val l1 = ListNode(2) + l1?.next = ListNode(4) + l1?.next?.next = ListNode(3) + + val l2 = ListNode(5) + l2.next = ListNode(6) + l2?.next?.next = ListNode(4) + + val result = addTwoNumbers(l1, l2) + + if (result != null) { + printNode(result) + } + + +} + +fun printNode(node: ListNode) { + if (node != null) { + print(node.`val`) + } + node.next?.let { printNode(it) } +} + +class ListNode(var `val`: Int) { + var next: ListNode? = null +} + +fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? { + var currentL1Node = l1 + var currentL2Node = l2 + var result: ListNode? = null + var currentResult: ListNode? = result + //进位存储 + var tempResult = 0 + //终止条件,其中有一个不为null就可以循环 + while (currentL1Node != null || currentL2Node != null) { + var resultValue = 0 + if (tempResult != 0) { + resultValue += tempResult + tempResult = 0 + } + if (currentL1Node != null) { + resultValue += currentL1Node.`val` + } + if (currentL2Node != null) { + resultValue += currentL2Node.`val` + } + if (resultValue > 9) { + resultValue -= 10 + tempResult = 1 + } + val newNode = ListNode(resultValue) + if (currentResult == null) { + currentResult = newNode + result = currentResult + } else { + currentResult.next = newNode + } + currentResult = newNode + currentL1Node = currentL1Node?.next + currentL2Node = currentL2Node?.next + } + if (tempResult != 0) { + currentResult?.next = ListNode(1) + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode20.kt similarity index 97% rename from app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt rename to app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode20.kt index f38c5dd..4637904 100644 --- a/app/src/main/java/com/wangpos/datastructure/base/LeetCode20.kt +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode20.kt @@ -1,4 +1,4 @@ -package com.wangpos.datastructure.base +package com.wangpos.datastructure.leetcode import java.util.* diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode207.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode207.java new file mode 100644 index 0000000..f13a2b2 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode207.java @@ -0,0 +1,115 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.LinkedList; + +/** + * + * 广度优先搜索 通过保存一个入度表 + * + * 然后取出入度为0的元素添加到队列 + * + * 遍历入度为0的队列,如果到下一个有边,将下一个入度--1,当所有下一个边都--1 相当于移除这个点 + * + * 如果下一个点的入度为0 就添加到遍历的队列 + * + * 在遍历的时候计数一下看看是否所有点都遍历到可以判断环形 + * + * + * 深度优先搜索, + * + * 通过flag数组标识 0 未遍历 1遍历中,-1遍历完成 + * + * 如果遍历下一个点的时候判断1标识存在环 + * + * 遍历下一个节点,然后再递归调用 + * + * 邻接矩阵通过 graph[][]==1判断有没有边 + * 通过遍历依赖关系列表 [0]位置出现的次数就是入度,比如[1,3]证明 3到1的边,1的入度为1 + * + * 邻接表,可以通过数组中集合的个数表示入度 + * + * + */ +public class LeetCode207 { + + /** + * 时间复杂度 O(N + M)O(N+M),遍历一个图需要访问所有节点和所有临边,NN 和 MM 分别为节点数量和临边数量; + * 空间复杂度 O(N)O(N),为建立邻接矩阵所需额外空间。 + * + * @param numCourses + * @param prerequisites + * @return + */ + public boolean canFinish(int numCourses, int[][] prerequisites) { + + //统计课程安排图中每个节点的入度,生成 入度表 indegrees + int[] indegrees = new int[numCourses]; + + //我们定义的二维数组中,每个数组的含义是前一个依赖后一个, + //相当于先学完数组[1]号位元素才能学习数组[0] + //所以按照有向图的构成是数组[1]指向数组[0]的一条边,所以数组[0]的入度为1(相当于有一个箭头指向) + //由前面条件可以知道,遍历数组,统计每一个数组[0]号位置的出现次数就是他的入度数 + for (int[] cp : prerequisites) indegrees[cp[0]]++; + //保存入度为0的元素,也就是拓扑排序出发点 + LinkedList queue = new LinkedList<>(); + for (int i = 0; i < numCourses; i++) { + if (indegrees[i] == 0) queue.addLast(i); + } + //从每个出发点出发开始遍历 + while (!queue.isEmpty()) { + //取出入度为0的元素 + Integer pre = queue.removeFirst(); + //每次遍历,相当于从这个起点出发的所有边都遍历到了,所以相当于这个点遍历完就完成了一个课程,这就是广度优先搜索 + numCourses--; + //遍历其余边 + for (int[] req : prerequisites) { + //广度优先搜索就是逐个遍历,任意找到一个含有当前起点的边,如果不包含就跳过 + if (req[1] != pre) continue; + //找到之后,将这条边去掉,也就是将所指方向的点的入度减一 + //如果其入度也变成0了就加入到起点队列,方便下次遍历后也包含此点 + //如果不存在环则可以按照某个顺序遍历所有点 + if (--indegrees[req[0]] == 0) queue.add(req[0]); + } + } + return numCourses == 0; + } + + + public boolean canFinish2(int numCourses, int[][] prerequisites) { + int[][] adjacency = new int[numCourses][numCourses]; + //定义节点标识 + int[] flags = new int[numCourses]; + //将数组变成矩阵 + for (int[] cp : prerequisites) + adjacency[cp[1]][cp[0]] = 1; + for (int i = 0; i < numCourses; i++) { + if (!dfs(adjacency, flags, i)) return false; + } + return true; + } + + /** + * 这里使用了一个小技巧,就是通过标识 0未被访问,1 标识正在被这条分支访问中,-1标识这个分支访问结束 + * 所以可以很容易判断 如果被访问状态是1状态就说明存在了环路 + * + * @param adjacency + * @param flags + * @param i + * @return + */ + private boolean dfs(int[][] adjacency, int[] flags, int i) { + if (flags[i] == 1) return false;//表示本次访问的节点还没访问结束又被子节点访问了,所以就存在了环路 + if (flags[i] == -1) return true;//表示此点已被访问 + if (flags[i] == 0) flags[i] = 1; //当前已被访问,继续这个点的子节点 + for (int j = 0; j < adjacency.length; j++) { + //adjacency[i][j] == 1 表示之间有边 + if (adjacency[i][j] == 1 && !dfs(adjacency, flags, j)) return false; + + } + ///当前已被访问完毕,子节点也访问完毕 + flags[i] = -1; + return true; + } + +} + diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode207.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode207.kt new file mode 100644 index 0000000..f105267 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode207.kt @@ -0,0 +1,22 @@ +package com.wangpos.datastructure.leetcode + +/** + * 207. 课程表 + * + * 现在你总共有 n 门课需要选,记为 0 到 n-1。 + +在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] + +给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习? + + */ +fun main() { + + val data = arrayOf(arrayOf(1,0).toIntArray(),arrayOf(0,1).toIntArray()) + + //统计课程安排图中每个节点的入度,生成 入度表 indegrees + + val result = LeetCode207().canFinish(2,data) + + println("结果:${result}") +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode210.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode210.java new file mode 100644 index 0000000..ed8afae --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode210.java @@ -0,0 +1,91 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.LinkedList; +import java.util.Stack; + +public class LeetCode210 { + + public int[] findOrder(int numCourses, int[][] prerequisites) { + + Stack stack = new Stack(); + int[] array = new int[0]; + if (canFinish2(numCourses, prerequisites, stack)) { + array = new int[numCourses]; + } else { + return array; + } + + int index = 0; + while (!stack.isEmpty()) { + array[index] = stack.pop(); + index++; + } + return array; + } + + /** + * 时间复杂度: O(N),其中NN为课程数。我们需要要对森林中的所有结点执行完全的深度优先搜索。之所以是森林而不是图,是因为并非所有结点都连接在一起。也可能存在不连通的部分。 + * 空间复杂度: O(N), 递归栈占用的空间(不是用于存储拓扑排序的栈)。 + * 利用深度优先搜索 + */ + + public boolean canFinish2(int numCourses, int[][] prerequisites, Stack stack) { + int[][] adjacency = new int[numCourses][numCourses]; + //定义节点标识 + int[] flags = new int[numCourses]; + //将数组依赖关系变成矩阵 + for (int[] cp : prerequisites) + adjacency[cp[1]][cp[0]] = 1; + + for (int i = 0; i < numCourses; i++) { + if (!dfs(numCourses, adjacency, flags, i, stack)) { + return false; + } + } + return true; + } + + /** + * 这里使用了一个小技巧,就是通过标识 0未被访问,1 标识正在被这条分支访问中,-1标识这个分支访问结束 + * 所以可以很容易判断 如果被访问状态是1状态就说明存在了环路 + * + * @param adjacency + * @param flags + * @param i + * @return + */ + private boolean dfs(int numCourses, int[][] adjacency, int[] flags, int i, Stack stack) { + if (flags[i] == 1) return false;//表示本次访问的节点还没访问结束又被子节点访问了,所以就存在了环路 + if (flags[i] == -1) { + return true;//表示此点已被访问 + } + if (flags[i] == 0) flags[i] = 1; //当前已被访问,继续这个点的子节点 + for (int j = 0; j < adjacency.length; j++) { + //adjacency[i][j] == 1 判断有边,如果result false证明有环就return + if (adjacency[i][j] == 1 && !dfs(numCourses, adjacency, flags, j, stack)) return false; + + //等价代码 +// if (adjacency[i][j] == 1) { +// boolean result = dfs(numCourses, adjacency, flags, j, stack); +// if (!result) { +// //有环路 +// return false; +// } +// } + + } + ///当前已被访问完毕,子节点也访问完毕 + + flags[i] = -1; + //保存遍历 + stack.push(i); + return true; + } + + + /** + * 方法二: 利用结点的入度 + */ + + +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode210.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode210.kt new file mode 100644 index 0000000..7d9a6f0 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode210.kt @@ -0,0 +1,37 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + +/** + * 现在你总共有 n 门课需要选,记为 0 到 n-1。 + +在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] + +给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 + +可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组 + */ + +fun main() { + + val course = arrayOf( + arrayOf(1, 0).toIntArray(), + arrayOf(2, 0).toIntArray(), + arrayOf(3, 1).toIntArray(), + arrayOf(3, 2).toIntArray() + ) + + val num = course.size + + //深度优先搜索,判断无环就可以完全修,并且保存所有路径 + + //将课程数组转化成邻接矩阵 + + // + + val result = LeetCode210().findOrder(4,course) + + println("result=${Arrays.toString(result)}") + + +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode230.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode230.kt new file mode 100644 index 0000000..83f3a8e --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode230.kt @@ -0,0 +1,120 @@ +package com.wangpos.datastructure.leetcode + +/** +LeetCode 第 230 题 + +给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 + +说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 + + +解题思路 + +这道题考察了两个知识点: +二叉搜索树的性质 +二叉搜索树的遍历 + +二叉搜索树的性质:对于每个节点来说,该节点的值比左孩子大,比右孩子小,而且一般来说,二叉搜索树里不出现重复的值。 + +二叉搜索树的中序遍历是高频考察点,节点被遍历到的顺序是按照节点数值大小的顺序排列好的。即,中序遍历当中遇到的元素都是按照从小到大的顺序出现。 + +因此,我们只需要对这棵树进行中序遍历的操作,当访问到第 k 个元素的时候返回结果就好。 + */ +fun main() { + + val array = arrayOf(5, 3, 6, 2, 4, 1) + val tree = buildTree(array) + + // [1, 2, 3, 4, 5, 6] + // 3 + println(kthSmallest(tree, 3)) + +} + + +fun kthSmallest(tree: Tree, k: Int): Int { + val resultList = arrayListOf() + findTree(tree, k, resultList) + + println(resultList) + return resultList[k - 1] +} + +//利用中序遍历 +fun findTree(root: Tree, k: Int, result: ArrayList) { +// if (result.size == k) {//找到第k就不要找了 +// return +// } + root.left?.let { findTree(it, k, result) } + result.add(root.data) + root.right?.let { findTree(it, k, result) } +} + + +fun buildTree(array: Array): Tree { + var root: Tree? = null + array.forEach { + if (root == null) { + root = Tree(data = 5) + } else { + addTree(root!!, it) + } + } +// +// root?.let { printTree_ROOT_LEFT_RIGHT(it) } +// println() +// root?.let { printTree_LEFT_ROOT_RIGHT(it) } +// println() +// root?.let { printTree_LEFT_RIGHT__ROOT(it) } + + return root!! +} + +//先序遍历 +fun printTree_ROOT_LEFT_RIGHT(root: Tree) { + print(root.data) + root.left?.let { printTree_ROOT_LEFT_RIGHT(it) } + root.right?.let { printTree_ROOT_LEFT_RIGHT(it) } +} + +//中序遍历 +fun printTree_LEFT_ROOT_RIGHT(root: Tree) { + root.left?.let { printTree_LEFT_ROOT_RIGHT(it) } + print(root.data) + root.right?.let { printTree_LEFT_ROOT_RIGHT(it) } +} + +//后序遍历 +fun printTree_LEFT_RIGHT__ROOT(root: Tree) { + root.left?.let { printTree_LEFT_RIGHT__ROOT(it) } + root.right?.let { printTree_LEFT_RIGHT__ROOT(it) } + print(root.data) +} + +fun addTree(root: Tree, it: Int) { + + if (it > root.data) { + addRight(root, it) + } else { + addLeft(root, it) + } +} + +fun addLeft(root: Tree, it: Int) { + if (root.left != null) { + addTree(root.left!!, it) + } else { + root.left = Tree(data = it) + } + +} + +private fun addRight(root: Tree, it: Int) { + if (root.right != null) { + addTree(root.right!!, it) + } else { + root.right = Tree(data = it) + } +} + +class Tree(var left: Tree? = null, var data: Int, var right: Tree? = null) \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode239.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode239.kt new file mode 100644 index 0000000..0ce81aa --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode239.kt @@ -0,0 +1,85 @@ +package com.wangpos.datastructure.leetcode + +import com.wangpos.datastructure.algorithm.search +import java.util.* +import kotlin.collections.ArrayList + + +/** + * + * + * LeetCode 第 239 题:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字,滑动窗口每次只向右移动一位。返回滑动窗口最大值。 + +注意:你可以假设 k 总是有效的,1 ≤ k ≤ 输入数组的大小,且输入数组不为空。 + +示例:给定一个数组以及一个窗口的长度 k,现在移动这个窗口,要求打印出一个数组,数组里的每个元素是当前窗口当中最大的那个数。 +输入:nums = [1, 3, -1, -3, 5, 3, 6, 7],k = 3 +输出:[3, 3, 5, 5, 6, 7] + */ + +fun main() { + + val nums = intArrayOf(1, 3, -1, -3, 5, 3, 6, 7) + + val k = 3//k = 8代表总长度 + val result = search(nums, k) + println(result.toString()) + +} + +/** + * 排序算法通常容易犯错 // val temp = nums[i] 一次访问赋值,记住这里不是指针,Java中没有指针,想要动态获取值,只能通过游标 + */ +fun search(nums: IntArray, k: Int): ArrayList { + val dQueue = LinkedList() + val resultList = arrayListOf() + //先将k排序,大到小 + + for (i in 0..(k - 2)) { //kotlin 遍历包含右边值,所以要减掉1,因为直接插入排序,少比较一个所以再减1 + // val temp = nums[i]//一次访问赋值,记住这里不是指针,Java中没有指针,想要动态获取值,只能通过游标 + for (j in (i + 1)..(k - 1)) { + if (nums[j] > nums[i]) { + val temp = nums[i] + nums[i] = nums[j] + nums[j] = temp + } + } + } + + // 将k个放入到队列滑块中,这里可以保证第一个是最大的 + + for (i in 0..(k - 1)) { + dQueue.add(nums[i]) + } + resultList.add(dQueue.first) + + for (j in k..(nums.size - 1)) { + var data = nums[j] + //是否加入队列 + ifAddQueue(dQueue, data) + //记录最大值,取队头就可以 + resultList.add(dQueue.first) + } + return resultList + +} + +private fun ifAddQueue(dQueue: LinkedList, data: Int) { + while (!dQueue.isEmpty()) { + val minData = dQueue.peekLast() + if (data > minData) { + dQueue.removeLast() + } else { + // 非空 且小于3 入队列 + if (dQueue.size < 3) { + dQueue.addLast(data) + } + //记住退出,队列没有比他再小的了退出 + break + } + } + //都被移除了,ok 你最大进来吧 + if (dQueue.isEmpty()) { + dQueue.add(data) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/base/LeetCode242.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode242.kt similarity index 94% rename from app/src/main/java/com/wangpos/datastructure/base/LeetCode242.kt rename to app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode242.kt index 42d5586..bb921c8 100644 --- a/app/src/main/java/com/wangpos/datastructure/base/LeetCode242.kt +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode242.kt @@ -1,4 +1,4 @@ -package com.wangpos.datastructure.base +package com.wangpos.datastructure.leetcode /** * 给定一个字符串 s 和 t diff --git a/app/src/main/java/com/wangpos/datastructure/base/LeetCode25.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode25.kt similarity index 94% rename from app/src/main/java/com/wangpos/datastructure/base/LeetCode25.kt rename to app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode25.kt index aae4621..e9673aa 100644 --- a/app/src/main/java/com/wangpos/datastructure/base/LeetCode25.kt +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode25.kt @@ -1,6 +1,4 @@ -package com.wangpos.datastructure.base - -import com.wangpos.datastructure.java.AddTwoNumber.ListNode +package com.wangpos.datastructure.leetcode /** diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode292.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode292.kt new file mode 100644 index 0000000..313b7d6 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode292.kt @@ -0,0 +1,18 @@ +package com.wangpos.datastructure.leetcode + +/** + * 292. Nim 游戏 + */ +fun main() { + +} + +fun canWinNim(n: Int): Boolean { + //取1 + if(n<=3) return true + + if(n%4==0)return false + + return true + +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode3.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode3.kt new file mode 100644 index 0000000..0eaaa35 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode3.kt @@ -0,0 +1,49 @@ +package com.wangpos.datastructure.leetcode + +/** + * 无重复字符的最长子串 + */ +fun main() { + + println(lengthOfLongestSubstring("abcabcdbb")) +} + +fun lengthOfLongestSubstring(s: String): Int { + //滑块方式 可以使用hashMap + val dQueue = mutableMapOf() + //初始化,添加到滑块当中,直到有重复数据 + + //移动滑块,也就是将其他数据分别和滑块中数据比较,如果不包含就加入 + + var resultSize = 0 + + val charArray = s.toCharArray() + var startIndex =0 + for (i in 0 until charArray.size) { + if (dQueue.contains(charArray[i])) { + //移除掉自己和之前的元素 + println("remove ${charArray[i]}") + val position = dQueue[charArray[i]]!! + var index = position + while (index >= startIndex) { + val data = charArray[index] + //判断此元素是之前添加的元素才移除 + if (dQueue.containsKey(data) && dQueue[data] == index) { + println("移除:${data}") + dQueue.remove(data) + } + index-- + } + startIndex = position + } + println(">>>>>>>>>>>${dQueue.size}") + dQueue[charArray[i]] = i + if (dQueue.size > resultSize) { + resultSize = dQueue.size + } + println("add ${resultSize} ${dQueue.size} ${charArray[i]}") + } + + return resultSize + //最后返回size +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode307.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode307.kt new file mode 100644 index 0000000..137f0a4 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode307.kt @@ -0,0 +1,175 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + +/** + * 给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点。 + +update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。 + + +频繁计算总和可以用这总结构,同时这种结构更新效率不再是O(1) + */ +fun main() { + + val result = NumArray(arrayOf(1, 3, 5).toIntArray()).sumRange(0,2) + + println("结果:${result}") +} + +class NumArray(nums: IntArray) { + + lateinit var tree: IntArray + + + init { + if (nums.size > 0) { + val n = nums.size + //数组元素不一定全部用满 + tree = IntArray(n * 2) + buildTree(nums) + } + } + + /** + * 先将叶子节点添加到tree 数组中 + * 从2n-1 到 n,因为顺序,所以从n 到2n-1 + * + * 求所有符节点 = 2*i +2*i+1 i从1开始 + * + * 最终数组中0号元素没用,1号元素才是树的根 + * + * 我们是从底部向上逆序,导致多出来一个0号元素,如果是从上到下,就会多出一个2n-1号元素 + * + * 这个二叉树克制,从底向上,从右向左 + * + * 注意:::最终得到的也不是完全二叉树 + * + * 因为完全二叉树定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树 + * + * + * + * 9 8 + * + * 1(3) 3(4) 5(5) + * + * 从右向左底部线排列好叶子节点,然后计算父节点 2*i +2*i+1,8 = 3 + 5,当叶子节点不够,父节点也会充当叶子节点去,比如9 = 8+1 + * + * 线段树 + */ + private fun buildTree(nums: IntArray) { + var i = n //恰好第n个位置为叶子节点,不如3个数据,n=3 表示我们需要3个叶子节点,至少需要2*n的数组来存储,构建一个6个节点的树 + var j = 0 + /** + * 相当于数组n 到 2n-1,一共n个数据 + */ + while (i < 2 * n) { + //初始化叶子节点 + println(""+i+" "+j) + + tree[i] = nums[j] +// println(nums[j]) + i++ + j++ + } + + println(Arrays.toString(tree)) + + i = n-1 + //初始化和 + while (i>0){ + println(i) + tree[i] = tree[i * 2] + tree[i * 2 + 1] + i-- + } + + println(Arrays.toString(tree)) + } + + fun update(i: Int, `val`: Int) { + var pos = i + pos += n //这个加n才是tree 数组中位置 + //直接更新 + tree[pos] = `val` + //调整 + + /** + * 如果 pos是偶数 例如修改3 left 是自己,right 是自己+1@author + * + * 如果pos是奇数 例如修改1 left 是自己-1,right 是自己 + * + * 9 8 + * + * 1 3 5 + */ + while (pos > 0) { + var left = pos + var right = pos + if (pos % 2 == 0) { + right = pos + 1 + } else { + left = pos - 1 + } + // parent is updated after child is updated + tree[pos / 2] = tree[left] + tree[right] + pos /= 2 + } + + } + + fun sumRange(i: Int, j: Int): Int { +// get leaf with value 'l' + var l = i + var r = j + l += n//获取tree中坐标 + // get leaf with value 'r' + r += n + var sum = 0 + while (l <= r) { + + + if ((l % 2) == 1) { + println(">>>"+tree[l]) + sum += tree[l] + l++ + } + if ((r % 2) == 0) { + println(">>>>>>"+ tree[r]) + sum += tree[r] + r-- + } + l /= 2 + r /= 2 + } + return sum + + } + +} + + +/** + * 一般方式 sumRang 时间复杂度为O(n) + * +private int[] nums; +public int sumRange(int i, int j) { +int sum = 0; +for (int l = i; l <= j; l++) { +sum += data[l]; +} +return sum; +} + +public int update(int i, int val) { +nums[i] = val; +} + */ + +/** +sqrt 分解 +其思想是将数组分割成块,块的长度为 sqrt n +​ +。然后我们计算每个块的和,并将其存储在辅助存储器 b 中。要查询 RSQ(i, j),我们将添加位于内部的所有块和部分在范围 [i\ldots j][i…j] 重叠的块的总和。 + + + */ \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode307_4.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode307_4.java new file mode 100644 index 0000000..ccb00d7 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode307_4.java @@ -0,0 +1,338 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.ArrayList; +import java.util.List; + +class NumArray4 { + + public static void main(String[] args) { + int value[] = new int[]{0,-3,-3,1,1,2}; + NumArray4 numArray = new NumArray4(value); + System.out.println("sumRange结果=" + numArray.sumRange(3, 5)); + +// System.out.println("" + numArray.countRange(0, 1)); + + } + + private int[] b; + private int len; + private int[] nums; + SegementTree tree; + + public NumArray4(int[] nums) { + + Merger merger = new Merger() { + @Override + public Integer merge(Integer a, Integer b) { + return a + b; + } + }; + + Integer data[] = new Integer[nums.length]; + for (int i = 0; i < nums.length; i++) { + data[i] = nums[i]; + } + tree = new SegementTree(data, merger); + tree.printSegementTree(); +// System.out.println("区间数量:" + tree.countRangeSum(1, 3)); + + } + + public int sumRange(int i, int j) { + return tree.query(i, j); + } + + public void update(int i, int val) { + tree.set(i, val); + } + + public int countRange(int i, int j) { + return tree.countRangeSum(i, j); + } + + + public interface Merger { + + /** + * 合成方法,a和b代表一个父节点下的两个子节点的值 + * + * @param a + * @param b + * @return 根据a和b,计算出的父节点对应的值 + */ + public E merge(E a, E b); + + } + + public static class SegementTree { + + /** + * 线段树中传入的值,存储的副本 + */ + public E[] data; + + /** + * 线段树中的节点,其中父节点的值为它的两个子节点merge后的值 + */ + public E[] tree; + + /** + * 合成器,构造线段树时候同时传入合成器 + */ + public Merger merger; + + /** + * 构造线段树 + * + * @param data 传入的数据 + * @param merger 传入的合成器 + */ + public SegementTree(E[] data, Merger merger) { + if (data.length == 0) { + return; + } + this.merger = merger; + int length = data.length; + this.data = (E[]) new Object[length]; + //复制数据到data中 + for (int i = 0; i < length; i++) { + this.data[i] = data[i]; + } + //总共n个叶子节点,n-1个非叶子节点 + tree = (E[]) new Object[length * 4]; + //构造线段树 + buildSegementTree(0, 0, length - 1); + } + + /** + * 构造线段树中的tree中的节点 + * + * @param treeIndex tree中对应节点的index + * @param left 这个节点对应data中的范围的左边界,root对应0 + * @param right 这个节点对应data中的范围的右边界,root对应length-1 + *

+ *

+ *

+ * 由根节点出发构建子树,最终通过回溯,构建父节点 + * 通常比较难理解的就是数组中元素位置和树节点对应关系, + *

+ * 首先从根节点出发(也就是tree 0元素)递归去为每个节点赋值 + * 递归一次计算左右孩子节点的index,递归一次相当于数组被分成了两份,所以除以二,其中奇数时算在左区间中 + * 递归终止条件就是被拆分的数组 left == right,说明不可拆分,此时将tree对应index的数组修改成这个不可分的数组值, + * 其他节点也是这样不相等就继续分,因为叶子节点只能保存一个值,最终全部分配到叶子节点后向上回溯父节点的值 + *

+ * 这里通过一个合成器,来动态定义父节点的赋值策略,可以使两个节点的和,也可以是两个节点中最大值 + *

+ * 比如 一个根节点 放3个数组,放不下,继续拆分, 其中有节点 放[2,2]这只有一个元素,直接存储 + * 左边[0,1]放不下,继续才分,[0,0][1,1] 可以放下了,结束 + */ + public void buildSegementTree(int treeIndex, int left, int right) { + if (left == right) { + //如果left==right,证明递归结束,在对应的index设置data里left的值 + System.out.println("size" + tree.length + "treeIndex=" + treeIndex + "left=" + left); + tree[treeIndex] = data[left]; + return; + } + //tree中父节点为treeIndex,的左右孩子的index + int leftChildIndex = getLeftChild(treeIndex); + int rightChildIndex = getRightChild(treeIndex); + int mid = left + (right - left) / 2;//如果偶数左边右边一样多,如果是奇数,算到左边中 + //构造左右孩子节点 + buildSegementTree(leftChildIndex, left, mid); + buildSegementTree(rightChildIndex, mid + 1, right); + //根据左右孩子的值,通过合成器,决定父节点的值 + tree[treeIndex] = merger.merge(tree[leftChildIndex], tree[rightChildIndex]); + } + + /** + * 返回左孩子在数组中的位置 + * + * @param index 父节点的index + * @return 左孩子节点的index + */ + public int getLeftChild(int index) { + //可以这样看,root节点,index:0 + //root的左孩子,index:1 + //root的右孩子,index:2 + //root的左孩子的左孩子,index:3 + //root的左孩子的有孩子,index:4 + return 2 * index + 1; + } + + /** + * 返回右孩子在数组中的位置 + * + * @param index 父节点的index + * @return 右孩子节点的index + */ + public int getRightChild(int index) { + return 2 * index + 2; + } + + /** + * 打印线段树 + */ + public void printSegementTree() { + System.out.println("开始打印线段树----------"); + System.out.println("线段树数据的长度为" + data.length); + for (int i = 0; i < tree.length; i++) { + System.out.println("位置" + i + ": " + tree[i]); + } + + System.out.println("打印线段树结束----------"); + } + + /** + * 返回data中区间left和right间,对应的值 + * + * @param left + * @param right + * @return + */ + public E query(int left, int right) { + if (left < 0 || right < 0 || left >= data.length || right >= data.length || left > right) { + return null; + } + return queryRange(0, 0, data.length - 1, left, right); + + } + + /** + * 统计区间数量,也就是节点数量 + * + * @param left + * @param right + * @return + */ + public int countRangeSum(int left, int right) { + int l = left; + int r = right; + if (left > right) { + return 0; + } + if (right < 0) { + return 0; + } + if (r >= data.length) { + r = data.length - 1; + } + if (l < 0) { + l = 0; + } + + List posList = new ArrayList(); + queryCount(0, 0, data.length - 1, l, r, posList); + return posList.size(); + } + + + public E queryCount(int treeIndex, int treeLeft, int treeRight, int queryLeft, int queryRight, List posList) { + + + if (treeLeft == queryLeft && treeRight == queryRight) { + //如果该节点的范围正好对应查询范围,直接返回 + System.out.println("********1"); + posList.add(treeIndex); + return tree[treeIndex]; + } + int leftChildIndex = getLeftChild(treeIndex); + int rightChildIndex = getRightChild(treeIndex); + int mid = treeLeft + (treeRight - treeLeft) / 2; + if (queryLeft >= mid + 1) { + //如果查询范围仅仅对应左孩子或者右孩子 + return queryCount(rightChildIndex, mid + 1, treeRight, queryLeft, queryRight,posList); + } else { + if (queryRight <= mid) { + return queryCount(leftChildIndex, treeLeft, mid, queryLeft, queryRight,posList); + } + } + //查询范围,左右孩子都有 + E resultLeft = queryCount(leftChildIndex, treeLeft, mid, queryLeft, mid,posList); + E resultRight = queryCount(rightChildIndex, mid + 1, treeRight, mid + 1, queryRight,posList); + //最终结果是左右孩子的合并 + E result = merger.merge(resultLeft, resultRight); + System.out.println("********2"); + posList.add(treeIndex); + return result; + } + + /** + * 在以tree中位置为treeIndex为根节点,而且该节点对应的data中的范围为[treeLeft,treeRight]
+ * 查询范围为[queryLeft,queryRight]对应的值 + * + * @param treeIndex + * @param treeLeft + * @param treeRight + * @param queryLeft + * @param queryRight + * @return + */ + public E queryRange(int treeIndex, int treeLeft, int treeRight, int queryLeft, int queryRight) { + if (treeLeft == queryLeft && treeRight == queryRight) { + //如果该节点的范围正好对应查询范围,直接返回 + System.out.println("********1"); + return tree[treeIndex]; + } + int leftChildIndex = getLeftChild(treeIndex); + int rightChildIndex = getRightChild(treeIndex); + int mid = treeLeft + (treeRight - treeLeft) / 2; + if (queryLeft >= mid + 1) { + //如果查询范围仅仅对应左孩子或者右孩子 + return queryRange(rightChildIndex, mid + 1, treeRight, queryLeft, queryRight); + } else { + if (queryRight <= mid) { + return queryRange(leftChildIndex, treeLeft, mid, queryLeft, queryRight); + } + } + //查询范围,左右孩子都有 + E resultLeft = queryRange(leftChildIndex, treeLeft, mid, queryLeft, mid); + E resultRight = queryRange(rightChildIndex, mid + 1, treeRight, mid + 1, queryRight); + //最终结果是左右孩子的合并 + E result = merger.merge(resultLeft, resultRight); + System.out.println("********2"); + return result; + } + + + /** + * 在线段树中修改data中index的元素,设置新的值为value + * + * @param index + * @param value + */ + public void set(int index, E value) { + if (index < 0 || index >= data.length) { + return; + } + setValue(0, 0, data.length - 1, index, value); + } + + /** + * 在以tree中位置为treeIndex为根节点,而且该节点对应的data中的范围为[treeLeft,treeRight] 下,
+ * 修改data中index的元素,设置新的值为value + * + * @param treeIndex + * @param treeLeft + * @param treeRight + * @param index + * @param value + */ + public void setValue(int treeIndex, int treeLeft, int treeRight, int index, E value) { + if (treeLeft == treeRight) { + tree[treeIndex] = value; + return; + } + int leftChildIndex = getLeftChild(treeIndex); + int rightChildIndex = getRightChild(treeIndex); + int mid = treeLeft + (treeRight - treeLeft) / 2; + if (index <= mid) { + setValue(leftChildIndex, treeLeft, mid, index, value); + } else { + setValue(rightChildIndex, mid + 1, treeRight, index, value); + } + tree[treeIndex] = merger.merge(tree[leftChildIndex], tree[rightChildIndex]); + } + + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode315.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode315.kt new file mode 100644 index 0000000..7f7055b --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode315.kt @@ -0,0 +1,5 @@ +package com.wangpos.datastructure.leetcode + +fun main() { + // +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode319.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode319.kt new file mode 100644 index 0000000..d0f4ff4 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode319.kt @@ -0,0 +1,17 @@ +package com.wangpos.datastructure.leetcode + +import java.lang.Math.sqrt +import kotlin.math.sqrt + +fun main() { + + val result = bulbSwitch(3) + + + println(result) +} + +fun bulbSwitch(n: Int): Int { +// return sqrt(n.toDouble()).toInt() + return 0 +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode327.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode327.java new file mode 100644 index 0000000..19aaaa9 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode327.java @@ -0,0 +1,141 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.ArrayList; +import java.util.List; + + +class Solution { + public int countRangeSum(int[] nums, int lower, int upper) { + if(nums.length==0){ + return 0; + } + LeetCode327 leetCode327 = new LeetCode327(nums); + return leetCode327.countRange(lower, upper); + } +} + +public class LeetCode327 { + SegementTree tree; + + public LeetCode327(int[] nums) { + + Merger merger = new Merger() { + @Override + public Integer merge(Integer a, Integer b) { + return a + b; + } + }; + + Integer data[] = new Integer[nums.length]; + for (int i = 0; i < nums.length; i++) { + data[i] = nums[i]; + } + tree = new SegementTree(data, merger); + tree.printSegementTree(); + + } + + public int countRange(int i, int j) { + return tree.countRangeSum(i, j); + } + + + public interface Merger { + public E merge(E a, E b); + } + + public static class SegementTree { + public E[] data; + + public E[] tree; + + public Merger merger; + + public SegementTree(E[] data, Merger merger) { + if (data.length == 0) { + return; + } + this.merger = merger; + int length = data.length; + this.data = (E[]) new Object[length]; + //复制数据到data中 + for (int i = 0; i < length; i++) { + this.data[i] = data[i]; + } + //总共n个叶子节点,n-1个非叶子节点 + tree = (E[]) new Object[length * 4]; + //构造线段树 + buildSegementTree(0, 0, length - 1); + } + + public void buildSegementTree(int treeIndex, int left, int right) { + if (left == right) { + //如果left==right,证明递归结束,在对应的index设置data里left的值 + tree[treeIndex] = data[left]; + return; + } + //tree中父节点为treeIndex,的左右孩子的index + int leftChildIndex = getLeftChild(treeIndex); + int rightChildIndex = getRightChild(treeIndex); + int mid = left + (right - left) / 2;//如果偶数左边右边一样多,如果是奇数,算到左边中 + //构造左右孩子节点 + buildSegementTree(leftChildIndex, left, mid); + buildSegementTree(rightChildIndex, mid + 1, right); + //根据左右孩子的值,通过合成器,决定父节点的值 + tree[treeIndex] = merger.merge(tree[leftChildIndex], tree[rightChildIndex]); + } + + public int getLeftChild(int index) { + return 2 * index + 1; + } + + public int getRightChild(int index) { + return 2 * index + 2; + } + + public void printSegementTree() { + System.out.println("开始打印线段树----------"); + System.out.println("线段树数据的长度为" + data.length); + for (int i = 0; i < tree.length; i++) { + System.out.println("位置" + i + ": " + tree[i]); + } + + System.out.println("打印线段树结束----------"); + } + + public int countRangeSum(int left, int right) { + int l = left; + int r = right; + + List posList = new ArrayList(); + queryCount(0, 0, data.length - 1, l, r, posList); + return posList.size(); + } + + public void queryCount(int treeIndex, int left, int right, int l, int r, List posList) { + if (left == right) { + //如果left==right,证明递归结束,在对应的index设置data里left的值 +// System.out.println("size>>>>>" + tree[treeIndex]); + tree[treeIndex] = data[left]; + if ((Integer) tree[treeIndex] >= l && (Integer) tree[treeIndex] <= r) { + posList.add(treeIndex); + } + return; + } + //tree中父节点为treeIndex,的左右孩子的index + int leftChildIndex = getLeftChild(treeIndex); + int rightChildIndex = getRightChild(treeIndex); + int mid = left + (right - left) / 2;//如果偶数左边右边一样多,如果是奇数,算到左边中 + //构造左右孩子节点 + queryCount(leftChildIndex, left, mid, l, r, posList); + queryCount(rightChildIndex, mid + 1, right, l, r, posList); + //根据左右孩子的值,通过合成器,决定父节点的值 + if ((Integer) tree[treeIndex] >= l && (Integer) tree[treeIndex] <= r) { + posList.add(treeIndex); + } + tree[treeIndex] = merger.merge(tree[leftChildIndex], tree[rightChildIndex]); +// System.out.println("size>>" + tree[treeIndex]); + } + + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode327.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode327.kt new file mode 100644 index 0000000..551e6bb --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode327.kt @@ -0,0 +1,4244 @@ +package com.wangpos.datastructure.leetcode + +import com.wangpos.datastructure.algorithm.search +import java.util.* + +fun main() { + //为什么int型最大的数是2147483647 + val value = intArrayOf( + 13, + 6, + 13, + 4, + 27, + -14, + -13, + 15, + -4, + 13, + -15, + 21, + -23, + 19, + 3, + -14, + -27, + -17, + -4, + 15, + 1, + -27, + -17, + -12, + -26, + 12, + 11, + -24, + 9, + -18, + 18, + 26, + -5, + -25, + -29, + -26, + 17, + -24, + -22, + 27, + -2, + 16, + -7, + -17, + 15, + -10, + -24, + -14, + -19, + -22, + -1, + -9, + -30, + -11, + 20, + -14, + -5, + 4, + 20, + 7, + -2, + 20, + 26, + 16, + -13, + -10, + 3, + -29, + 13, + 26, + 14, + -2, + -13, + 18, + 28, + 9, + -11, + 17, + -28, + -4, + -23, + -23, + -7, + -22, + 11, + 2, + -24, + -4, + -11, + 9, + -23, + 29, + 9, + -10, + -17, + -16, + -11, + 2, + -28, + 3, + 12, + -8, + -16, + -16, + -25, + 27, + 21, + -17, + -5, + 17, + -17, + -30, + 2, + -13, + -14, + -2, + -15, + -26, + -12, + 9, + 12, + -26, + 19, + 21, + 10, + -10, + 9, + -15, + 5, + -1, + -14, + 19, + -18, + -30, + 15, + -9, + -19, + -11, + -20, + 14, + -9, + 18, + -19, + -9, + -18, + 29, + 14, + -29, + 11, + -9, + -7, + -21, + 12, + -17, + -11, + -23, + -8, + 1, + -1, + -5, + -22, + -26, + -18, + 27, + 6, + -24, + -27, + 21, + -25, + -22, + 17, + 18, + 28, + 20, + -7, + 19, + 6, + -11, + 14, + 10, + 6, + -22, + -4, + 13, + 5, + 5, + 3, + -10, + 0, + -6, + -29, + 2, + -22, + 10, + -26, + 3, + -23, + 29, + 28, + 4, + 0, + -26, + 13, + -1, + 4, + -13, + 25, + 23, + 27, + -30, + 5, + -21, + 26, + -12, + 4, + 4, + 23, + 4, + -27, + 15, + 5, + 15, + 11, + -1, + 0, + -28, + 8, + -26, + -22, + 27, + -3, + 6, + -19, + -28, + 27, + 8, + -13, + -30, + 3, + 25, + -9, + 2, + -5, + 26, + -2, + 7, + 11, + -22, + 26, + -6, + 8, + 22, + 24, + 7, + 8, + 8, + 28, + -22, + -12, + 5, + -2, + 1, + -8, + -30, + -20, + 4, + -17, + 22, + -6, + -25, + -4, + 27, + 20, + 25, + 8, + 14, + -26, + 20, + 3, + 1, + 18, + -27, + 3, + 4, + -20, + 9, + -30, + 3, + -26, + -21, + 0, + -24, + -20, + -18, + -28, + -28, + -18, + -25, + -14, + -3, + -15, + 25, + 3, + -16, + -24, + -13, + 13, + -12, + 27, + -26, + 9, + 15, + 23, + 17, + -14, + -20, + -2, + 15, + 0, + 3, + 6, + 9, + 26, + 18, + -11, + 27, + 19, + 16, + 3, + 9, + 7, + -12, + 15, + 7, + 26, + 28, + 1, + -3, + -19, + 27, + -27, + -29, + 8, + 22, + 9, + -15, + -3, + -17, + 25, + 15, + -16, + 20, + -28, + 28, + 22, + 28, + 16, + -27, + -21, + -17, + -17, + 24, + -10, + -16, + -27, + -18, + -25, + -13, + 25, + 11, + 28, + -7, + 7, + 6, + 23, + -27, + -19, + 13, + 25, + -23, + -14, + -21, + 4, + -10, + 0, + -24, + 26, + 5, + -6, + 6, + -27, + 23, + -30, + 10, + 19, + -12, + 10, + 15, + -5, + -15, + -2, + 7, + -1, + -17, + -14, + 10, + 29, + -24, + -7, + 2, + 21, + -19, + -8, + -27, + -3, + 22, + -5, + -6, + 8, + 26, + 10, + -17, + 12, + -6, + 9, + 3, + 7, + -26, + -26, + 4, + 6, + 2, + 23, + 7, + 13, + -20, + -19, + 5, + 3, + 0, + -10, + -21, + 25, + -20, + -20, + -22, + 6, + -18, + 19, + 22, + -13, + -21, + 17, + 4, + -22, + 19, + 6, + 5, + 25, + -17, + 6, + 18, + 19, + 11, + 23, + 3, + 6, + 22, + 24, + -15, + -27, + -5, + -12, + -27, + 14, + -22, + 26, + -26, + -11, + -20, + -7, + 18, + 19, + 23, + -25, + 17, + -27, + 22, + 22, + -13, + -23, + -6, + -18, + 25, + 7, + -13, + -24, + -6, + -1, + 18, + 13, + -12, + 3, + 11, + -20, + 10, + -13, + 18, + 25, + -7, + -8, + -17, + 17, + -3, + 5, + 16, + 23, + 17, + -18, + 27, + 26, + -10, + 20, + 5, + -11, + 5, + -29, + 18, + 29, + 12, + 2, + -21, + -11, + -4, + 12, + -5, + 24, + 5, + -20, + 25, + 9, + 3, + -8, + 2, + 19, + 20, + 24, + -1, + -3, + -2, + -27, + 19, + 24, + 28, + 13, + 17, + 16, + 13, + -12, + -8, + 5, + -14, + 21, + -2, + -25, + 6, + 9, + -13, + 1, + -12, + 26, + -13, + 15, + -21, + 13, + 4, + 16, + 5, + -24, + 15, + -14, + 15, + 14, + -28, + 21, + 1, + -8, + 21, + -25, + -5, + -23, + -15, + -18, + -25, + -24, + 7, + 25, + -18, + -22, + 15, + 4, + -25, + -17, + -9, + -1, + 15, + 6, + 26, + 22, + 15, + 17, + -22, + -2, + 15, + -28, + -16, + -14, + -20, + 17, + -18, + -4, + 6, + 17, + -19, + 7, + 0, + -3, + -26, + 15, + 12, + -5, + -25, + -21, + 26, + 17, + 14, + -28, + 13, + 13, + 29, + 2, + 7, + -12, + 1, + 28, + -1, + -20, + -30, + -15, + 5, + 25, + -20, + -18, + -15, + -25, + -23, + 24, + 16, + -2, + -26, + -22, + 16, + -20, + -5, + -20, + 18, + -28, + -24, + 7, + -17, + -12, + -22, + 17, + 29, + -8, + 11, + 25, + -4, + -26, + -18, + 20, + -23, + -29, + 27, + 27, + 17, + 20, + 7, + -11, + -9, + -26, + -5, + 5, + -6, + -16, + -4, + 13, + 11, + -6, + -20, + 19, + -9, + 8, + 12, + -15, + 3, + 25, + -23, + 0, + -24, + 6, + -24, + -23, + -1, + -5, + 22, + -29, + 7, + -20, + -7, + 18, + -18, + -18, + 15, + 17, + -7, + -12, + 29, + -12, + -28, + -11, + -25, + 28, + 19, + -16, + -25, + 23, + -25, + 8, + -13, + -18, + -28, + -17, + -15, + 6, + -5, + -27, + 18, + 15, + -11, + -30, + 6, + 23, + 8, + -4, + 4, + -14, + -29, + 12, + 18, + 11, + 1, + 12, + 4, + 24, + 5, + -14, + -29, + -4, + -11, + 4, + 16, + -30, + -16, + 23, + -21, + -19, + 6, + 26, + 22, + 19, + -8, + 27, + -14, + -8, + -6, + -30, + -26, + 27, + -26, + -28, + -25, + 8, + 10, + -4, + -15, + 0, + 22, + -20, + -20, + 10, + -17, + -11, + 13, + 9, + 8, + 24, + -16, + -16, + -8, + 25, + 3, + 22, + -8, + 24, + -6, + 9, + -29, + 20, + -9, + 24, + -8, + 23, + -8, + 22, + -4, + 15, + 0, + 19, + 10, + 27, + 26, + 23, + 20, + 15, + 18, + -22, + 4, + -18, + -18, + -30, + 7, + -21, + 5, + -12, + 25, + -9, + -4, + -30, + -4, + 20, + -19, + 22, + 3, + 18, + 17, + 8, + -13, + -17, + 9, + 7, + 25, + 11, + -10, + -27, + -3, + -17, + 10, + -30, + -24, + -29, + -21, + -2, + -3, + 2, + -25, + 26, + -9, + -12, + 18, + -17, + 15, + 20, + 9, + 21, + -24, + 5, + 7, + -28, + 18, + 8, + -11, + 16, + -26, + 3, + 3, + 6, + -16, + -12, + 18, + 4, + -17, + -19, + 10, + 22, + -6, + 20, + 6, + 28, + 2, + -15, + 7, + -20, + 11, + 3, + -22, + -20, + -25, + 28, + 5, + -11, + -23, + 20, + 16, + 23, + -5, + 5, + 8, + -23, + 25, + 6, + 26, + -7, + -13, + -2, + -8, + 29, + 17, + 20, + -14, + -15, + 17, + -20, + -14, + -27, + 21, + 29, + -11, + -20, + 8, + 19, + -18, + -1, + 29, + 5, + 14, + 23, + 15, + 7, + 11, + -15, + 15, + 10, + 9, + 16, + 26, + -8, + -29, + 7, + 6, + -9, + -30, + -6, + 18, + -2, + -10, + 18, + -29, + -1, + -23, + 24, + 23, + -15, + -4, + -3, + -19, + 22, + 18, + -27, + -11, + 14, + 8, + 4, + -6, + 10, + -12, + -10, + 21, + 7, + -15, + -21, + 2, + 12, + 3, + -30, + -9, + -25, + 8, + 19, + 5, + 12, + -12, + -15, + -12, + -9, + 19, + -7, + 17, + 0, + 5, + 17, + -1, + 22, + 13, + -27, + 15, + -28, + -29, + 23, + -19, + 13, + -8, + 23, + 12, + -13, + -15, + -18, + -26, + -22, + -3, + -7, + 2, + -4, + 24, + 2, + 11, + 21, + -27, + 26, + 14, + 13, + 14, + -30, + 19, + -22, + -29, + -1, + -27, + -4, + 25, + -14, + -12, + 4, + -6, + -18, + -11, + -8, + -5, + 29, + 9, + -11, + 22, + -10, + 10, + -8, + 5, + 12, + -21, + 27, + -1, + 28, + -21, + 15, + 26, + -16, + 10, + -17, + 7, + -24, + 0, + -20, + -13, + 3, + 15, + -19, + -18, + -8, + -12, + 20, + 10, + -8, + 25, + 26, + -11, + 23, + 14, + -1, + -7, + -22, + -22, + -16, + -2, + 19, + -27, + 5, + 17, + 28, + 20, + 17, + -12, + -13, + -7, + 22, + 17, + -8, + -2, + 28, + 5, + 29, + -27, + -15, + -2, + 26, + -30, + -6, + -4, + 16, + 25, + 5, + -19, + 1, + -14, + -6, + 29, + -13, + 27, + 20, + 7, + 10, + 21, + 12, + 10, + -12, + -21, + -10, + -2, + -18, + -11, + -15, + 1, + -11, + 21, + 6, + 26, + 20, + -24, + 29, + 6, + 26, + -5, + -18, + -12, + -16, + -11, + 11, + -24, + 4, + 13, + 15, + -9, + -3, + 17, + -16, + 5, + -17, + -25, + -30, + -21, + 15, + -16, + 27, + -5, + -4, + -25, + 28, + 7, + 17, + 27, + -18, + -20, + -9, + 13, + 3, + -12, + -16, + -23, + 19, + -9, + 10, + 0, + -22, + -23, + 10, + -20, + -4, + 25, + 28, + -8, + -20, + 7, + -1, + -26, + -12, + 8, + -22, + 24, + 21, + -15, + -26, + -5, + 10, + 24, + -27, + -5, + -1, + -30, + 29, + 23, + 28, + -10, + -27, + -16, + 13, + -1, + 12, + -10, + 13, + 14, + -30, + -5, + -25, + 19, + -19, + 13, + 26, + 27, + 3, + 3, + 28, + 3, + -9, + 8, + 6, + 23, + -2, + -9, + -26, + 22, + -2, + 19, + 12, + -19, + -15, + 15, + 9, + -29, + -24, + 27, + -1, + -15, + -17, + 11, + 11, + -1, + 14, + -29, + -19, + 24, + -29, + -4, + -15, + -26, + -21, + 9, + -1, + -22, + -17, + -9, + -28, + -1, + -29, + 9, + 25, + 13, + 14, + -29, + -23, + -22, + 1, + -14, + 26, + -27, + -14, + 12, + 13, + 11, + 1, + 14, + -1, + 11, + -14, + -16, + -3, + 5, + 2, + -8, + -12, + 0, + 17, + -5, + -6, + -6, + 25, + -19, + 21, + 25, + 12, + 4, + 21, + -9, + 8, + -11, + -30, + 26, + 19, + 15, + 20, + 18, + -13, + 0, + -30, + 8, + -16, + -2, + -17, + 2, + 17, + -21, + -25, + 5, + 26, + 26, + 23, + -6, + -28, + 11, + -16, + 1, + -5, + 13, + -14, + 7, + 0, + -10, + -30, + -16, + -29, + -25, + 12, + -15, + -9, + -2, + 15, + 4, + -18, + 27, + 19, + -26, + 4, + -17, + 18, + -15, + -24, + 24, + -17, + -16, + 19, + -30, + -20, + 13, + 20, + 18, + -14, + -26, + -22, + 10, + 23, + 27, + -28, + 5, + -6, + -21, + 26, + -3, + 10, + 1, + 26, + -18, + 9, + 16, + -6, + 13, + -29, + 8, + 6, + -30, + -1, + 20, + -30, + 0, + 23, + 1, + -23, + 20, + -25, + -29, + 29, + 29, + 21, + -13, + -5, + 3, + -16, + -18, + 24, + 7, + 27, + -27, + -11, + -21, + 14, + 10, + 0, + 15, + 26, + -9, + 23, + -13, + -6, + 22, + -9, + -9, + -6, + -7, + -25, + 6, + -7, + 19, + 22, + -24, + 28, + 29, + 4, + 16, + 28, + 23, + 0, + -3, + 21, + -1, + 3, + -25, + -19, + -19, + 17, + -22, + 9, + 28, + -11, + 28, + -4, + -3, + -25, + 21, + -23, + -30, + 10, + 25, + -18, + 10, + 17, + -15, + 27, + 19, + 3, + 18, + -30, + 29, + 6, + -26, + 10, + 27, + 21, + 1, + -26, + -20, + -10, + -6, + 26, + -3, + -13, + 0, + -2, + 22, + 4, + -28, + -8, + -26, + -29, + 8, + -12, + -13, + 29, + 4, + 3, + 3, + -12, + -7, + 28, + 26, + -29, + 28, + -20, + -15, + -19, + 26, + 26, + -27, + 14, + -5, + -6, + 21, + -28, + 15, + -30, + -20, + -26, + -7, + -26, + 27, + 24, + -9, + -10, + -21, + 26, + -5, + -16, + 0, + 23, + -3, + -20, + -5, + 15, + -10, + -4, + -2, + 16, + 17, + -17, + -3, + -22, + -27, + 25, + 28, + -26, + -6, + -14, + -8, + -19, + -24, + -8, + 12, + -26, + -13, + -7, + 10, + 29, + -7, + -10, + -30, + 13, + 15, + 21, + -1, + 5, + 7, + 1, + 8, + 7, + -2, + -13, + 15, + -19, + 15, + 23, + 10, + 20, + 28, + 22, + -2, + -1, + 25, + -22, + 9, + -22, + 3, + -8, + -5, + 10, + 18, + -7, + 2, + 4, + -1, + -4, + -17, + 29, + 29, + 29, + -27, + -16, + -18, + -14, + -3, + -12, + 19, + -9, + -1, + -2, + -14, + 16, + -15, + 7, + -4, + 24, + -5, + -14, + -29, + -21, + -21, + 12, + 17, + 20, + -10, + -3, + -16, + 19, + 7, + -28, + -22, + -30, + -28, + -3, + -23, + 11, + 8, + 14, + 11, + 19, + 24, + -12, + -25, + 10, + 2, + -13, + 9, + 10, + -12, + -8, + 20, + -14, + 14, + 8, + 24, + -28, + 0, + 1, + 14, + -28, + 2, + -6, + 4, + -19, + -19, + -28, + 21, + -3, + 15, + -28, + 25, + -27, + 8, + 25, + -29, + -17, + 9, + -21, + -20, + -21, + 6, + -22, + -6, + -30, + -13, + -27, + 25, + 21, + 26, + 6, + -19, + -1, + 29, + -30, + -23, + 29, + 12, + -5, + -8, + -25, + 19, + 18, + -1, + 25, + -9, + 3, + 15, + 0, + -2, + 28, + -19, + -24, + -17, + 26, + -12, + 17, + 23, + 7, + 21, + -25, + 2, + 6, + 10, + 18, + -4, + 21, + -14, + -8, + -27, + 24, + 26, + -2, + 20, + -29, + -14, + 13, + 16, + 21, + -26, + -9, + -20, + 9, + -5, + -7, + 13, + -26, + 2, + -30, + 13, + -12, + 12, + -27, + 27, + -9, + -19, + 7, + -9, + -2, + -5, + -16, + 29, + 25, + 26, + 0, + 6, + 27, + -22, + -1, + -22, + -1, + 13, + -10, + 15, + -29, + 24, + 14, + 27, + -28, + -16, + 10, + 3, + 9, + -22, + -8, + -22, + -25, + -7, + -3, + 5, + 26, + -28, + 14, + 15, + 28, + 4, + 4, + 20, + -5, + -13, + 20, + -30, + 5, + -25, + -23, + -11, + -14, + -14, + 14, + 21, + 3, + -25, + -21, + 19, + -19, + 11, + -28, + 9, + -4, + -30, + -3, + -18, + -8, + -15, + -6, + -10, + -17, + -23, + -2, + 22, + -1, + -11, + 28, + 9, + 3, + -20, + -6, + 8, + 5, + 14, + 26, + 24, + -22, + -17, + -24, + -15, + -10, + 19, + 13, + -10, + -8, + 21, + -7, + 12, + -19, + 25, + 16, + 4, + -7, + 28, + 23, + -30, + -2, + 4, + 27, + 8, + 13, + -23, + 3, + 24, + -15, + -20, + 10, + 2, + 11, + 7, + 21, + -2, + 20, + -30, + 19, + 11, + 5, + 5, + -29, + 21, + 28, + -18, + 19, + -28, + 29, + 9, + -18, + -26, + -12, + 12, + -15, + -6, + -13, + 29, + 23, + 7, + -23, + -19, + -30, + -11, + -11, + -25, + 19, + -26, + -28, + -28, + 25, + -2, + 29, + 6, + 3, + -19, + -18, + 27, + 20, + 23, + 25, + -27, + 27, + -30, + -25, + 28, + 13, + -25, + -30, + 1, + -14, + -9, + -15, + 27, + 2, + 28, + 28, + -20, + 8, + 1, + -19, + -8, + -4, + 6, + 10, + -11, + 27, + -18, + -9, + 27, + 7, + -1, + -12, + -16, + 3, + -28, + -8, + -22, + 20, + -5, + -16, + 16, + 17, + 20, + -29, + 22, + -3, + -1, + -5, + -11, + 18, + 2, + -12, + 8, + 4, + 15, + -14, + 5, + 25, + 17, + -18, + -17, + -12, + -10, + 18, + -7, + 8, + -30, + -22, + -28, + -10, + -30, + 14, + -5, + -9, + 16, + -24, + -16, + 0, + 2, + 4, + -14, + 9, + -2, + 1, + -6, + -7, + 10, + -20, + -1, + 0, + 25, + 27, + -24, + 3, + -10, + 27, + -8, + 12, + 8, + 6, + 16, + -14, + -24, + 4, + 5, + 12, + -7, + -9, + 8, + 3, + 9, + 10, + -8, + 24, + 12, + -13, + 8, + 10, + -23, + 4, + 10, + 16, + 20, + 7, + 8, + -29, + -11, + -29, + 21, + 23, + 20, + 23, + 12, + -26, + -14, + 10, + -2, + 21, + -29, + 5, + 18, + 10, + -27, + -11, + -22, + -25, + 1, + 14, + -12, + 1, + -26, + -11, + -13, + -2, + 7, + 10, + -24, + -15, + -26, + 1, + 13, + 23, + 8, + -26, + 29, + 8, + -13, + -11, + -21, + 5, + -25, + 13, + -7, + 20, + 28, + 5, + 25, + 22, + -23, + 7, + -21, + 4, + -8, + 9, + -24, + 13, + 22, + 19, + 24, + -27, + 2, + 23, + 28, + -22, + 0, + 14, + 3, + -27, + -1, + -17, + 27, + 12, + -19, + 13, + 3, + 23, + 0, + -26, + 28, + -15, + 0, + 2, + -11, + 4, + -26, + 3, + 8, + -15, + -12, + 2, + -12, + -25, + 15, + 4, + 4, + 11, + -18, + 9, + 6, + 5, + 26, + -11, + -22, + 6, + 17, + -23, + -14, + -7, + -24, + -28, + -25, + -3, + -15, + 18, + 10, + -20, + 15, + -17, + -16, + 11, + 22, + 13, + 4, + 6, + -10, + -12, + 28, + 15, + 0, + 19, + -30, + -5, + 8, + 16, + -23, + 4, + -18, + 10, + -1, + -25, + -8, + -21, + -13, + 5, + -19, + -8, + -6, + 6, + 0, + 13, + 7, + 17, + 12, + -3, + -17, + -21, + 16, + -17, + -3, + 13, + 10, + -27, + -1, + -16, + 9, + 18, + -1, + 5, + -19, + 11, + 14, + -12, + -3, + -1, + -16, + 22, + -9, + 19, + -11, + 28, + -14, + -19, + 2, + 22, + 9, + 9, + 23, + 22, + 0, + 1, + 21, + 5, + -3, + 10, + -3, + -8, + -6, + 13, + 25, + -19, + 26, + 9, + -29, + -26, + 13, + -28, + 20, + -2, + 20, + 12, + 6, + 3, + 22, + -13, + -29, + -5, + -22, + -2, + -14, + -17, + -2, + 7, + 24, + 27, + 17, + -21, + 7, + -21, + 9, + 19, + 26, + -28, + 8, + -20, + -26, + -9, + 22, + -2, + 1, + -9, + -28, + 26, + 15, + -13, + -29, + -25, + -11, + -23, + 2, + 15, + 6, + -14, + -18, + -9, + -4, + -17, + -30, + -12, + 7, + -19, + -8, + 14, + -29, + -17, + 0, + -5, + -29, + 4, + 14, + 25, + -29, + 4, + -6, + 18, + 10, + 7, + 0, + -19, + 21, + 29, + 2, + 21, + 17, + -26, + 16, + 22, + -24, + 18, + 19, + -4, + 19, + 29, + -6, + 0, + 23, + -23, + 17, + 18, + -30, + 4, + 23, + 17, + 17, + 14, + -5, + -9, + -19, + 4, + 23, + 9, + -14, + 23, + 18, + 19, + 4, + 20, + 17, + 24, + 13, + 11, + -3, + -16, + 29, + 9, + 11, + 23, + 26, + -18, + 24, + 7, + 19, + 13, + -20, + 14, + 11, + -4, + 19, + 6, + 22, + -2, + 8, + -5, + -15, + 29, + 14, + 23, + -8, + 16, + -21, + 29, + 5, + 15, + 16, + 3, + 15, + -25, + 27, + -23, + -11, + 15, + 17, + -29, + -27, + 13, + 13, + -11, + 6, + 18, + 9, + -2, + 26, + -11, + -15, + 11, + 5, + 17, + -3, + 25, + 11, + 6, + -20, + -19, + 8, + -7, + -9, + -27, + 22, + -21, + -25, + -28, + -5, + -17, + -24, + -28, + 26, + -3, + 11, + -28, + 21, + -16, + -18, + 4, + -15, + 29, + 7, + 5, + -26, + 22, + -12, + 14, + 14, + 21, + -25, + 29, + -27, + -4, + -29, + 24, + 10, + 27, + 29, + -5, + 21, + -22, + -4, + -6, + -28, + 1, + -24, + -4, + 25, + 11, + -26, + 16, + -13, + -11, + 19, + -15, + 17, + -4, + 10, + -11, + 16, + -18, + -8, + -21, + -8, + -13, + -9, + 5, + -5, + -7, + -29, + -7, + 22, + -23, + -26, + 12, + 13, + 17, + -18, + 14, + 1, + 25, + 28, + 17, + 20, + 15, + -12, + 11, + 5, + -28, + -28, + 3, + 11, + 17, + 23, + -20, + 1, + 23, + -4, + 23, + 13, + -26, + 0, + -12, + 22, + 18, + -19, + -1, + -29, + -12, + -4, + -8, + 9, + -27, + -11, + -9, + 4, + -11, + 2, + -8, + -17, + -27, + -10, + 0, + 18, + -14, + 21, + -11, + -18, + 22, + -18, + -13, + 12, + -22, + 28, + 27, + -30, + 23, + -22, + -2, + -17, + -16, + -2, + -21, + 2, + -4, + 9, + 23, + -13, + -25, + -7, + 6, + -22, + 7, + -29, + -21, + 28, + 1, + -4, + -12, + -12, + -25, + -11, + -8, + 19, + -27, + -5, + -14, + -15, + -24, + 1, + -30, + 29, + 3, + 24, + 8, + -25, + -8, + 7, + 5, + 4, + -13, + 1, + 2, + -30, + -6, + 9, + 17, + -13, + -11, + -26, + 11, + -15, + -5, + -4, + 12, + -28, + -10, + -6, + -16, + 8, + 23, + 5, + 27, + 29, + 5, + 6, + -23, + 8, + 16, + 16, + 0, + -23, + 11, + 27, + 25, + 4, + 15, + 17, + -19, + -27, + -17, + -18, + 24, + 8, + 16, + 11, + 3, + -27, + -5, + -29, + -21, + 2, + -22, + -13, + -17, + 19, + -20, + 24, + -28, + -30, + 0, + 0, + 9, + -16, + 12, + -11, + 9, + 7, + -7, + 10, + -21, + -28, + -13, + 20, + -7, + 22, + -4, + -24, + 14, + 12, + -2, + 0, + -10, + -21, + 12, + -1, + 13, + 10, + -14, + -17, + 3, + -19, + 13, + -10, + 3, + -13, + 10, + 13, + 7, + -8, + -12, + -30, + 12, + -18, + -11, + 24, + -12, + -6, + -2, + -19, + -16, + 19, + 3, + -12, + -19, + 20, + 6, + -28, + 27, + 28, + 12, + -30, + 0, + 28, + -30, + -21, + -17, + -8, + 25, + 10, + 16, + -10, + -11, + 10, + -24, + 4, + 13, + -30, + 3, + -28, + 23, + -5, + -18, + -25, + 12, + -1, + 16, + 12, + -14, + 3, + 29, + 8, + -30, + 21, + 5, + -29, + -21, + -25, + -28, + -8, + 20, + 12, + -22, + -27, + 11, + -11, + 14, + 22, + 2, + 7, + -16, + 21, + -2, + -23, + 20, + -28, + 3, + 29, + -5, + -20, + -22, + 20, + -16, + -7, + 24, + -16, + 20, + 18, + 0, + -15, + -29, + -17, + 5, + -21, + 7, + -30, + 22, + 28, + -29, + 28, + 21, + 10, + -19, + -7, + 27, + 4, + 1, + -2, + 5, + -26, + -14, + 15, + 26, + -13, + 20, + -20, + -23, + -5, + 0, + 18, + 2, + 2, + 19, + 29, + 22, + -20, + -27, + 20, + -14, + -13, + -5, + -10, + 26, + -10, + -7, + -22, + -6, + -12, + 29, + 9, + -14, + -1, + -7, + 25, + 8, + -25, + 12, + -14, + -1, + 22, + 24, + -29, + -16, + -3, + 9, + 26, + 28, + 29, + -10, + 24, + -28, + 9, + 16, + -29, + -16, + 13, + 7, + 6, + 0, + -12, + -3, + -27, + -30, + 18, + 4, + -13, + -14, + -12, + 20, + 1, + 12, + -10, + -6, + -4, + -22, + 11, + -24, + -26, + 22, + -4, + 4, + 21, + -17, + 27, + 5, + 5, + 5, + 14, + -23, + -7, + 24, + -19, + 17, + -6, + 0, + 17, + 15, + -28, + 7, + 28, + -30, + -30, + 24, + 10, + 1, + -3, + 1, + 20, + 5, + 12, + 26, + 12, + -3, + 19, + 7, + 1, + -24, + -5, + 7, + -2, + 10, + -26, + -26, + 7, + 16, + 4, + 2, + 27, + -2, + 17, + -9, + 13, + -5, + -15, + -23, + 5, + -8, + 15, + 24, + -12, + -5, + 2, + -6, + -23, + -24, + -25, + 29, + 22, + -15, + -16, + -21, + 3, + 5, + -7, + 10, + -3, + -13, + -26, + -10, + 24, + 9, + 9, + -17, + -5, + 5, + -26, + 13, + -15, + 5, + -3, + -5, + 10, + 3, + 23, + 3, + -21, + 4, + 25, + 19, + -25, + -15, + -15, + -15, + 3, + 8, + -5, + 25, + -4, + -23, + 10, + 29, + 24, + 1, + 24, + 6, + -17, + 4, + 17, + 5, + -14, + -13, + -1, + -30, + -5, + 21, + -2, + -28, + 10, + -9, + 7, + -25, + 15, + 12, + 3, + 0, + 16, + 22, + 19, + 2, + -4, + -21, + -22, + -2, + -12, + 28, + 15, + 12, + -27, + 27, + -11, + 29, + -10, + 22, + 26, + -26, + -30, + 16, + 0, + 7, + -5, + 4, + 7, + -19, + -24, + -3, + -8, + -10, + 0, + -25, + -26, + -19, + 20, + 20, + 11, + 3, + -18, + 23, + -6, + -2, + -7, + 11, + -20, + -15, + 6, + 26, + 5, + -14, + -11, + -8, + 17, + -30, + 4, + -13, + -3, + -4, + -20, + -4, + 13, + -3, + -22, + 23, + 11, + 27, + 17, + 17, + -19, + -30, + -8, + 10, + -5, + 3, + -6, + -28, + -7, + -15, + -17, + -17, + -27, + 22, + 29, + -6, + 14, + 6, + 23, + -13, + 24, + 3, + -21, + -6, + 14, + -7, + 19, + 14, + -18, + -17, + 7, + -11, + 1, + -24, + -7, + -10, + 0, + 11, + 13, + -20, + -17, + 4, + -16, + -7, + 1, + 15, + -11, + -18, + -23, + -13, + 3, + -10, + 0, + 5, + 15, + -25, + 7, + 4, + 13, + -16, + -12, + 21, + -7, + -7, + -16, + -4, + -7, + 29, + -3, + 26, + -14, + -14, + -1, + 23, + 25, + 4, + -3, + 27, + 3, + 7, + 15, + 21, + -8, + -17, + -30, + 15, + 29, + -6, + -25, + 13, + 17, + 17, + 8, + -10, + -20, + -23, + -27, + 4, + -8, + 0, + 25, + -7, + 4, + 4, + 18, + -26, + 22, + 0, + 10, + 0, + 8, + -26, + -1, + -5, + 15, + 14, + -23, + 7, + 12, + -16, + 16, + 3, + 20, + -27, + -5, + 16, + 0, + -28, + -13, + 26, + -10, + 24, + 20, + -5, + -12, + 14, + 26, + 0, + 19, + 9, + -28, + -26, + 3, + 10, + 3, + -18, + 18, + -29, + -7, + 24, + -26, + 16, + -15, + 19, + 9, + 4, + -12, + -27, + 12, + 14, + -6, + -5, + 12, + 27, + 15, + 16, + 29, + -27, + -4, + -21, + 12, + 15, + 21, + -13, + -19, + 12, + -30, + 14, + -9, + 2, + -13, + -14, + 8, + 7, + 9, + -15, + 0, + 26, + 11, + -23, + -7, + -16, + 26, + 7, + -8, + 19, + 17, + -4, + -11, + 1, + 20, + 13, + 10, + -10, + -9, + -19, + -26, + 27, + 3, + -5, + -12, + 11, + -5, + 18, + -2, + 4, + 18, + 12, + -19, + 7, + -15, + -10, + 7, + 26, + -10, + -10, + -24, + 14, + 11, + -12, + -15, + -19, + -30, + -29, + 12, + -6, + 2, + -16, + -19, + 0, + -16, + 16, + -21, + -14, + 23, + -1, + -5, + -4, + 22, + 22, + 24, + 19, + 5, + 2, + 29, + -13, + 19, + 3, + -29, + 14, + 12, + 27, + 24, + 21, + 9, + 25, + -26, + -9, + 13, + 22, + -5, + -6, + 15, + -17, + 3, + 27, + -18, + 29, + -8, + -10, + -22, + -7, + -14, + -6, + 0, + 24, + 24, + 3, + -22, + -1, + -15, + 21, + 0, + 25, + 4, + -18, + -9, + 10, + -16, + 17, + -16, + 21, + 12, + -30, + -22, + 6, + -8, + -18, + -27, + -27, + 28, + -9, + -2, + -30, + 21, + 5, + 1, + 5, + 11, + -25, + 9, + -6, + -17, + 17, + 8, + -29, + 10, + 0, + -25, + 19, + -30, + -3, + -12, + -4, + 27, + -29, + -1, + 22, + 23, + -21, + 10, + 29, + 28, + 2, + -6, + 12, + -9, + 22, + -12, + -5, + -17, + -25, + -11, + 28, + 3, + -15, + -21, + 20, + 13, + -10, + -12, + 1, + 28, + 25, + -16, + -5, + -7, + -22, + 15, + 26, + -14, + -10, + -24, + 27, + -24, + -24, + 14, + -11, + 7, + -6, + -10, + 8, + 4, + -2, + -26, + -7, + 7, + 20, + -7, + -12, + 11, + -7, + 0, + 1, + 19, + -2, + -15, + 19, + -10, + 23, + 10, + -4, + 3, + 7, + 0, + 23, + -20, + -7, + -14, + 3, + 9, + -6, + -2, + 28, + 26, + 29, + 8, + 4, + 25, + 4, + 23, + -24, + 17, + 0, + -15, + -6, + 29, + 25, + -6, + 19, + -15, + -11, + -20, + -6, + 13, + -9, + 17, + 7, + -9, + 4, + 18, + -25, + 25, + -20, + -3, + 5, + 0, + 3, + 7, + -14, + 23, + 0, + 9, + -26, + -30, + 28, + 24, + -10, + 0, + -28, + -21, + -13, + 23, + -28, + -3, + -19, + -12, + -20, + -24, + 9, + 21, + 21, + -26, + 29, + 12, + 21, + -18, + -19, + 7, + 1, + -1, + -21, + 4, + -12, + 22, + 24, + 20, + 12, + 9, + 7, + 11, + -16, + -27, + 11, + -16, + -7, + 12, + -19, + -16, + -29, + 28, + 24, + -4, + 9, + 21, + 8, + -16, + -2, + 18, + -9, + -22, + -2, + 24, + -1, + 17, + 15, + -18, + 26, + -16, + -27, + 24, + -9, + 26, + 18, + 3, + -12, + -21, + -20, + -13, + 25, + -3, + 16, + -3, + -7, + 18, + -4, + 25, + -22, + -9, + 25, + -21, + -9, + -18, + -13, + 1, + 17, + 20, + 19, + 25, + -22, + 9, + -10, + 1, + 2, + 13, + -12, + 1, + -3, + -3, + 16, + 28, + 15, + 0, + -4, + -12, + -30, + 8, + 1, + -24, + 5, + 28, + 24, + -20, + -2, + 3, + -1, + 0, + -22, + 14, + 27, + 8, + 2, + -12, + -28, + 12, + -18, + 17, + 0, + 16, + -14, + -10, + 22, + -19, + 1, + -13, + -7, + -12, + 25, + 13, + 21, + -13, + -6, + -5, + -19, + 18, + -13, + -28, + -1, + -13, + 22, + 20, + 7, + -9, + -15, + -11, + -17, + -27, + 5, + 21, + 28, + 20, + 12, + 25, + 25, + 4, + -12, + 28, + 17, + -14, + -2, + -6, + -25, + 15, + 29, + 8, + -10, + -5, + 6, + -9, + -29, + -29, + 25, + 9, + -17, + 1, + -4, + -29, + 18, + 23, + 4, + -20, + 14, + 4, + 18, + -13, + 6, + -13, + 19, + -6, + 10, + 21, + -17, + -5, + -16, + 26, + -27, + 3, + 21, + -21, + 28, + 25, + -26, + -28, + 23, + -11, + 15, + 10, + -27, + 19, + -27, + -12, + -17, + 0, + -24, + 8, + 8, + -24, + 0, + 12, + 4, + -27, + -3, + -7, + -26, + 15, + -29, + -27, + -25, + 25, + 20, + 5, + -29, + -23, + 0, + 27, + 23, + 0, + -1, + -2, + 6, + -7, + 13, + 6, + 10, + 28, + 24, + 8, + -14, + -9, + -8, + 24, + -3, + -11, + -1, + 27, + 6, + -29, + 17, + 0, + 19, + 9, + -11, + -7, + -26, + -27, + 10, + 26, + -6, + -10, + -1, + -14, + 19, + 28, + 22, + 19, + 8, + 20, + -3, + 5, + 13, + 21, + -7, + -21, + -25, + 2, + -26, + -17, + 28, + 7, + 25, + -1, + 9, + -14, + -6, + -24, + 26, + -30, + 4, + 26, + -4, + 20, + -21, + -22, + 6, + 17, + -17, + 21, + -25, + -23, + 18, + -13, + 16, + 29, + 8, + -27, + -26, + 9, + -16, + 15, + -30, + -2, + -16, + -7, + 29, + -2, + 2, + -3, + 5, + -21, + 13, + 10, + 5, + 4, + 15, + -19, + 9, + -24, + 28, + 17, + 9, + 21, + -19, + -3, + -1, + 17, + 24, + 5, + -14, + -23, + -8, + -19, + -10, + -7, + 25, + 4, + -6, + 24, + -12, + -19, + 17, + -11, + 26, + 8, + -16, + 28, + -29, + 27, + 15, + 20, + 22, + 15, + 11, + 26, + 9, + -21, + 3, + -6, + -22, + -23, + 14, + 2 + ) + + var value2 = intArrayOf(1, 2, -2, 3) +// val numArray = LeetCode327(value) +// System.out.println("sumRange结果=" + numArray.sumRange(0, 1)); + +// System.out.println("区间数量=" + numArray.countRange(0,0)); +// println("区间数量=" + numArray.countRange(3, 5)) +// println("区间数量=" + numArray.countRange(0, 2)) +// println("区间数量=" + numArray.countRange(-1, 9)) + println(">>>>>>" + countRangeSum(value2, 0, 5)) + + +} + +fun countRangeSum(nums: IntArray, lower: Int, upper: Int): Int { + + + println("start=${System.currentTimeMillis()}") + var p = IntArray(nums.size) //前缀和初始化,前缀和p[x],就是区间数组[0, x)的和 + + p[0] = nums[0] + for (i in 1 until nums.size) { + p[i] = p[i - 1] + nums[i] + + } + +// val index = findLeftIndex(p,lower) + + + p = mergeSort(p, 0, p.size - 1) + println("前缀和=${Arrays.toString(p)}") + var countArray = IntArray(1) + for (i in 0 until p.size) { + val left = p[i] - upper + val right = p[i] - lower + //二分法查找 + println("left=$left") + println("right=$right") + search(i,p, left, right, countArray) + } +// search(p, -5, 6, countArray) +// for(i in 1 until p.size){ +// for(j in i downTo 0 ){ +// +// +// //lower <=ij <= upper +// println("区间$i,$j") +// } +// } + //pi + lower, pi + upper + +// var countArray = IntArray(1) +// for (i in 0 until nums.size) { +//// for (j in 0 until i + 1) { +//// println("区间:$j,$i") +// val rangeSum = findRangeSum(nums, 0, nums.size - 1, lower, upper, countArray) +//// checkNumber(rangeSum, j, i, lower, upper, countArray) +//// } +// } + println("end=${System.currentTimeMillis()}") + return countArray[0] +} + +fun binaryHigh(i:Int,array: IntArray, value: Int): Int { + var low = 0 + var high = i + while (low <= high) { + val middle = (low + high) / 2 + if (value == array[middle]) { + high = middle + break + } + if (value > array[middle]) { + low = middle + 1 + } + if (value < array[middle]) { + high = middle - 1 + } + } + + var next = high+1 + + while (array[next]==array[high]){ + high = next + next +=1 + } + + if(high<0){ + return 0 + } + println("high=$high") + return high +} + +fun binaryLow(i:Int,array: IntArray, value: Int): Int { + var low = 0 + var high = i + + println("$low,$i") + while (low <= high) { + val middle = (low + high) / 2 + if (value == array[middle]) { + return middle + } + if (value > array[middle]) { + low = middle + 1 + } + if (value < array[middle]) { + high = middle - 1 + } + } + println("low=$low") + return low +} + +/** + * 二分法查找 + */ +fun search(i:Int,p: IntArray, leftValue: Int, rightValue: Int, countArray: IntArray) { + + if(leftValue>p[p.size-1]){ + return + } + if(rightValue>l"+leftPosition) + + println(">>r"+rightPosition) + +// lastCountArray[i] = rightPosition - leftPosition + 1 + countArray[0] += rightPosition - leftPosition + 1 + println("""countArray[0=]${countArray[0]}""") +} + +//val lastCountArray = IntArray + +fun mergeSort(nums: IntArray, l: Int, h: Int): IntArray { + if (l == h) + return intArrayOf(nums[l]) + + val mid = l + (h - l) / 2 + val leftArr = mergeSort(nums, l, mid) //左有序数组 + val rightArr = mergeSort(nums, mid + 1, h) //右有序数组 + val newNum = IntArray(leftArr.size + rightArr.size) //新有序数组 + + var m = 0 + var i = 0 + var j = 0 + /** + * 两个数组 前一半比后一半小 + */ + while (i < leftArr.size && j < rightArr.size) { + newNum[m++] = if (leftArr[i] < rightArr[j]) leftArr[i++] else rightArr[j++] + } + //左边剩余 + while (i < leftArr.size) + newNum[m++] = leftArr[i++] + //右边剩余 + while (j < rightArr.size) + newNum[m++] = rightArr[j++] + return newNum +} + +/** + * 统计区间和 + */ +fun findRangeSum( + nums: IntArray, + left: Int, + right: Int, + lower: Int, + upper: Int, + countArray: IntArray +): Long { + if (left == right) { + return nums[left].toLong() + } + + val mid = (left + right) / 2 + + val leftSum = findRangeSum(nums, left, mid, lower, upper, countArray) + val rightSum = findRangeSum( + nums, + mid + 1, + right, + lower, + upper, + countArray + ) + if ((leftSum + rightSum) > Integer.MAX_VALUE || -(leftSum + rightSum) > Integer.MAX_VALUE) { + return Long.MAX_VALUE + } + val sum = leftSum + rightSum + return sum +} + +private fun checkNumber( + sum: Long, + left: Int, + right: Int, + lower: Int, + upper: Int, + countArray: IntArray +) { + if (sum == Long.MAX_VALUE) { + return + } + if (sum in lower..upper) { +// println("合格数据" + sum + "left=$left right=$right") + countArray[0]++ + } else { +// println("不合格数据="+sum) + } + +} + +private fun checkNumber( + nums: IntArray, + left: Int, + right: Int, + lower: Int, + upper: Int, + countArray: IntArray +) { + if (nums[left] in lower..upper) { + println("合格数据 " + nums[left] + "left=$left right=$right") + countArray[0]++ + } else { + println("不合格数据=" + nums[left]) + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode329.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode329.kt new file mode 100644 index 0000000..9fcb1b7 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode329.kt @@ -0,0 +1,154 @@ +package com.wangpos.datastructure.leetcode + +/** + * 矩阵中最长增长路径 + * + * 记忆化: 对于大量重复调用的问题,缓存其结果。 + 动态规划要求按照拓扑顺序解决子问题。对于很多问题,拓扑顺序与自然秩序一致。而对于那些并非如此的问题,需要首先执行拓扑排序。因此,对于复杂拓扑问题(如本题),使用记忆化搜索通常是更容易更好的选择。 + + 想要让动态规划有效,如果问题 B 依赖于问题 A 的结果,就必须确保问题 A 比问题 B先计算。这样的依赖顺序对许多问题十分简单自然。如著名的斐波那契数列 + */ +fun main() { + + /** + * 通过二维数组定义方向 + * + * 比如当前的二维数组中元素为0,0;垂直整下的元素就需要第二位加一,也就是列加一,所以是0,1 + * 同理向上0,-1, 向左 -1,0,向右 1.0 + * + * + */ + + val matrix = arrayOf>(arrayOf(9, 9, 4), arrayOf(6, 6, 8), arrayOf(2, 2, 1)) + val result = longestIncreasingPath(matrix) + + println("结果:${result}") +} + +/** + * 采用深度优先搜索解决此题, + * + * 因为最坏时间是从第一列第一个个元素到第一列最后元素再到最后一行最后一个元素 + * + * 所以相当于第一次搜索 1分为二,第二次二分为4 所以时间复杂度2^n,注意这只是一个点的深度优先搜索,mn 个所以复杂度很高,具体为什么是2^(m+n)本人也没太仔细算 + * + * 时间复杂度是 O(2^(m+n)) + * + * 空间复杂度O(mn) + */ +fun longestIncreasingPath(matrix: Array>): Int { + + if (matrix.size == 0) return 0 + //几列 + m = matrix.size + //几行 + n = matrix[0].size + //最长路径 + var ans = 0 + for (i in 0 until m) { + for (j in 0 until n) { + //每个顶点做四个方向的深度优先搜索 + ans = Math.max(ans, dfs(matrix, i, j)); + } + } + + return ans +} + +/** + * 深度优先搜索 + */ +fun dfs(matrix: Array>, i: Int, j: Int): Int { + //定义本次记录的路径长度 + var ans = 0 + //四个方向相当于图的四个分支,每个方向做深度优先搜索, + for (d in dirs) { + val x = i + d[0]//下一个元素行坐标 + val y = j + d[1]//下一个元素列坐标 + /** + * 校验下标合法范围 + */ + if (0 <= x && x < m && 0 <= y && y < n ){ + //表示递增的 + if( matrix[x][y] > matrix[i][j]){ + //每次查找如果比当前的大就替换 + ans = Math.max(ans, dfs(matrix, x, y)) + } + } + } + //这里+1表示到达当前一步,如果四个方向都没有找到递增的就返回1 + // ,回溯一次多了1,回溯一次多了1,所以每次判断哪个路径回溯的最多, + //最终回溯到终点就是最长路径 ans + return ++ans +} + + +var m = 0 +var n = 0 +val dirs = arrayOf>(arrayOf(0, 1), arrayOf(1, 0), arrayOf(0, -1), arrayOf(-1, 0)) + + +/** + 记忆化深度优先搜索 + + 将递归的结果存储下来,这样每个子问题只需要计算一次。 + 从上面的分析中,我们知道在淳朴的深度优先搜索方法中有许多重复的计算。 + 一个优化途径是我们可以用一个集合来避免一次深度优先搜索中的重复访问。 + 该优化可以将一次深度优先搜索的时间复杂度优化到 O(mn)O(mn),总时间复杂度 O(m^2n^2)。 + + **/ + +fun longestIncreasingPath2(matrix: Array>): Int { + + if (matrix.size == 0) return 0 + //几列 + m = matrix.size + //几行 + n = matrix[0].size + //最长路径 + var ans = 0 + + val cache = Array(m) { IntArray(n) } + for (i in 0 until m) { + for (j in 0 until n) { + //每个顶点做四个方向的深度优先搜索 + ans = Math.max(ans, dfs2(matrix, i, j,cache)); + } + } + + return ans +} + +/** + * 记忆 深度优先搜索 + */ +fun dfs2( + matrix: Array>, + i: Int, + j: Int, + cache: Array +): Int { + //从缓存获取结果 + if (cache[i][j] != 0) return cache[i][j] + + //定义本次记录的路径长度 + var ans = 0 + //四个方向相当于图的四个分支,每个方向做深度优先搜索, + for (d in dirs) { + val x = i + d[0]//下一个元素行坐标 + val y = j + d[1]//下一个元素列坐标 + /** + * 校验下标合法范围 + */ + if (0 <= x && x < m && 0 <= y && y < n ){ + //表示递增的 + if( matrix[x][y] > matrix[i][j]){ + //每次查找如果比当前的大就替换 + //缓存每个节点的最长路径 + cache[i][j] = Math.max(ans, dfs2(matrix, x, y,cache)) + } + } + } + //这里+1表示到达当前一步 + return ++cache[i][j] +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode346.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode346.java new file mode 100644 index 0000000..a34586a --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode346.java @@ -0,0 +1,74 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.Queue; + +/** + * 346. 数据流中的移动平均值 + * + * 给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算其所有整数的移动平均值。 + * + * 示例: + * + * MovingAverage m = new MovingAverage(3); + * m.next(1) = 1 + * m.next(10) = (1 + 10) / 2 + * m.next(3) = (1 + 10 + 3) / 3 + * m.next(5) = (10 + 3 + 5) / 3 + * + */ +public class LeetCode346 { + + public static void main(String[] args) { + System.out.println("----start----"); + + LeetCode346 leetCode346 = new LeetCode346(3); + System.out.println(leetCode346.next(1)); + System.out.println(leetCode346.next(10)); + System.out.println(leetCode346.next(3)); + System.out.println(leetCode346.next(5)); + } + + Deque dqueues = new ArrayDeque(); + + int maxSize = 0; + + int queueSum = 0; + + /** + * Initialize your data structure here. + */ + public LeetCode346(int size) { + this.maxSize = size; + } + + + public double next(int val) { + + //如果size小于maxSize 直接添加 + + //返回队列和除以真实size + + int removeValue = 0; + if (dqueues.size() >= maxSize) { + removeValue = dqueues.removeFirst(); + } + dqueues.add(val); + + if (queueSum == 0) { + for (Integer dqueue : dqueues) { + queueSum += dqueue; + } + } else { + //减去移除的,添加新的 + queueSum = queueSum - removeValue + val; + } + + return queueSum*1.0 / dqueues.size(); + } + +} + + + diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode347.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode347.kt new file mode 100644 index 0000000..394ff8a --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode347.kt @@ -0,0 +1,82 @@ +package com.wangpos.datastructure.leetcode + + +import android.os.Build +import android.support.annotation.RequiresApi +import java.util.* + +/** + * + * 优先队列 + * + * 优先队列其实是一个二叉堆的结构,Binary Heap,他利用数组的结构来实现二叉树 + * + * 换句话说优先队列 本质是一个数组,数组里面每一个元素可能是其他元素父节点,也可能是期他元素子节点,并且每个父节点只能有2个子节点 + * + * 性质 + * 数组里面array[0] 是优先级最好的 + * 对于array[i]而言 + * + * 父节点是 (i-1)/2 + * 左孩子 2i + 1 + * 右孩子 2i + 2 + * + * 数组每个元素的优先级都高于孩子 + * + * + * 误区 每往堆里放入数据,都需要进行向上赛选,时间复杂度是nlog(n) 这是错误的,实际上再求极限时,时间复杂度是O(n) + * + * + * LeetCode 347 给一个非空数组,返回一个出现频率k高的元素 + * + * java的优先队列默认为小顶堆 + */ +@RequiresApi(Build.VERSION_CODES.N) +fun main() { + + val nums = arrayOf(1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6) + val nums2 = arrayOf(1, 1, 1, 2, 2, 3, 4, 5) + + println("给定数组:${Arrays.toString(nums)}") + + val resultArrays = findPriorityData(nums, 2) + + println("优先级最高的 2 个元素:${Arrays.toString(resultArrays)}") +} + + +@RequiresApi(Build.VERSION_CODES.N) +fun findPriorityData(nums: Array, index: Int): IntArray { + + val map = mutableMapOf() + countPriority(nums, map) + val comparator = + Comparator> { entry1: Map.Entry, entry2: Map.Entry -> + //java 优先队列默认是小顶堆,所以这里通过 entry2 - entry1 的优先级得到一个大顶堆 + entry2.value - entry1.value + } + val priorityQueue = PriorityQueue>(comparator) + map.forEach { + priorityQueue.add(it) + } + val resultList = mutableListOf() + + for (k in 0 until index) { + resultList.add(priorityQueue.poll().key) + } + return resultList.toIntArray() +} + +private fun countPriority( + nums: Array, + map: MutableMap +) { + for (i in nums.indices) { + if (map.containsKey(nums[i])) { + val increaseNumber = map[nums[i]]!!.plus(1) + map[nums[i]] = increaseNumber + } else { + map[nums[i]] = 1 + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode382.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode382.kt new file mode 100644 index 0000000..fc3666e --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode382.kt @@ -0,0 +1,41 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + +/** + * 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样。 + +进阶: +如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现? + + */ +fun main() { + val head = ListNode(1) + head.next = ListNode(2) + head.next!!.next = ListNode(3) + + val solution = Solution382(head) + + println("结果:${solution.random}") +} + + +internal class Solution382(private val head: ListNode) { + + val random: Int + get() { + var res = head.`val` + var no = head.next + var i = 2 + val random = Random() + while (no != null) { + if (random.nextInt(i) === 0) { + res = no.`val` + } + i++ + no = no.next + } + return res + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode398.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode398.kt new file mode 100644 index 0000000..2dec387 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode398.kt @@ -0,0 +1,41 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + + +/** + * 给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。 + */ +fun main() { + + val array = arrayOf(1,2,3,4,4,4) + val solution398 = Solution398(array.toIntArray()) + + println("结果:${solution398.pick(4)}") +} + +internal class Solution398(nums: IntArray) { + var mp = mutableMapOf>() + + init { + for (i in nums.indices) { + if (mp.containsKey(nums[i]) === false) { + val list = ArrayList() + list.add(i) + mp[nums[i]] = list + } else { + mp[nums[i]]?.add(i) + } + } + + } + + fun pick(target: Int): Int { + val r = Random() + val index = mp[target]!!.size + val random = r.nextInt(index) + println(random) + return mp[target]!!.get(random) + } +} + diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode4.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode4.kt new file mode 100644 index 0000000..bbc64c1 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode4.kt @@ -0,0 +1,152 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + +/** + * 4. 寻找两个有序数组的中位数 + * + * 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 + +请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 + +你可以假设 nums1 和 nums2 不会同时为空。 + + */ +fun main() { + + val num1 = arrayOf(1, 3, 5, 7, 9, 10).toIntArray() + val num2 = arrayOf(2, 4, 6, 8).toIntArray() +// val middleNumber = findMedianSortedArrays(num1, num2) + val middleNumber2 = findMedianSortedArrays2(num1,num2) + println("中位数 ${middleNumber2}") +} + +/** + * 暴力方法 合并再求解 时间复杂度是 O(m+n) + * 空间复杂度O(m+n) + */ +fun findMedianSortedArrays(nums1: Array, nums2: Array): Double { + + val m = nums1.size + val n = nums2.size + val nums = IntArray(m + n) + + //合并 + var count = 0 + var i = 0 + var j = 0 + while (count < (m + n)) { + if (i == m) { + while (j < n) { + nums[count++] = nums2[j++] + } + break + } + + if (j == n) { + while (i < m) { + nums[count++] = nums1[i++] + } + break + } + + //这里会存在i 或j 有一个先放完的情况,所以前面要做判断 + if (nums1[i] < nums2[j]) {//比较小的放数组前面,放完移动标志位进行下一个 + nums[count++] = nums1[i++] + } else { + nums[count++] = nums2[j++] + } + } + + println("合并后的数组${Arrays.toString(nums)}") + //获取中位数 + if (count % 2 == 0) { + //偶数 + return (nums[count / 2 - 1] + nums[count / 2]) / 2.0 + } else { + //奇数 + return nums[count / 2].toDouble() + } +} + + +fun findMedianSortedArrays2(nums1: IntArray, nums2: IntArray): Double { + val n = nums1.size + val m = nums2.size + val left = (n + m + 1) / 2 //如果是奇数,left位置 恰好是这个中位数 + val right = (n + m + 2) / 2 //偶数,需要获得(n+m)/2 和(n+m)/2两个数的平均值 + + //将偶数和奇数的情况合并,如果是奇数,会求两次同样的 k 。 +// return getKth(nums1, 0, n - 1, nums2, 0, m - 1, left).toDouble() + return (getKth(nums1, 0, n - 1, nums2, 0, m - 1, left) + getKth( + nums1, + 0, + n - 1, + nums2, + 0, + m - 1, + right + )) * 0.5 +} + +/** + * 寻找第k个小的 + */ +fun getKth( + nums1: IntArray, + start1: Int, + end1: Int, + nums2: IntArray, + start2: Int, + end2: Int, + k: Int +): Int { + val len1 = end1 - start1 + 1 + val len2 = end2 - start2 + 1 + + // 如果len1大于len2 就对调一下,保证len1小于len2 + if (len1 > len2) return getKth(nums2, start2, end2, nums1, start1, end1, k) + + //如果第一个数组被排除完,那么中位数肯定在未排除的数据中,因为都是有序的,所以直接可以推断出 + if (len1 == 0) return nums2[start2 + k - 1] + + if (k == 1) return Math.min(nums1[start1], nums2[start2]) + + //如果k/2小于剩下的长度,就取最小值,否者下面会数组越界,这是一个新的start + + //这里注意为什么是k/2 ,而不是k, 如果是k 相当于我们再比较数组中最大值,然后排除掉,下一次还是比较数组最大值,这样效率很低 + //所以每次排除一半数量k,然后拿k/2和另两个数组长度比,找最小值作为比较的位置,然后舍去之前的位置 + val i = start1 + Math.min(len1, k / 2) - 1 + + val j = start2 + Math.min(len2, k / 2) - 1 + + if (nums1[i] > nums2[j]) { + //排除前j个 + return getKth(nums1, start1, end1, nums2, j + 1, end2, k - (j - start2 + 1)); + } else { + //排除前i个 + return getKth(nums1, i + 1, end1, nums2, start2, end2, k - (i - start1 + 1)); + + } + +} +// +//private int getKth(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k) { +// int len1 = end1 - start1 + 1; +// int len2 = end2 - start2 + 1; +// //让 len1 的长度小于 len2,这样就能保证如果有数组空了,一定是 len1 +// if (len1 > len2) return getKth(nums2, start2, end2, nums1, start1, end1, k); +// if (len1 == 0) return nums2[start2 + k - 1]; +// +// if (k == 1) return Math.min(nums1[start1], nums2[start2]); +// +// int i = start1 + Math.min(len1, k / 2) - 1; +// int j = start2 + Math.min(len2, k / 2) - 1; +// +// if (nums1[i] > nums2[j]) { +// return getKth(nums1, start1, end1, nums2, j + 1, end2, k - (j - start2 + 1)); +// } +// else { +// return getKth(nums1, i + 1, end1, nums2, start2, end2, k - (i - start1 + 1)); +// } +//} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode444.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode444.java new file mode 100644 index 0000000..fedf2ac --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode444.java @@ -0,0 +1,110 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +/** + * 验证原始的序列 org 是否可以从序列集 seqs 中唯一地重建。序列 org 是 1 到 n 整数的排列, + * + * 其中 1 ≤ n ≤ 10^4。重建是指在序列集 seqs 中构建最短的公共超序列。(即使得所有  seqs 中的序列都是该最短序列的子序列)。确定是否只可以从 seqs 重建唯一的序列,且该序列就是 org + */ +public class LeetCode444 { + + public boolean sequenceReconstruction(int[] org, List> seqs) { + int n = org.length; + + if (n == 0 || seqs.size() == 0) { + return false; + } + + // 考虑seqs里头元素为空列表的情况, 已经数字超过n或者<=0的情况 + Set numSet = new HashSet<>(); + for (List list : seqs) { + for (Integer num: list) { + if (num <= 0 || num > n) { + return false; + } + numSet.add(num); + } + } + + if (numSet.size() < n) { + return false; + } + + ArrayList[] adj = new ArrayList[n + 1]; + + for (int i = 1; i <= n; i++) { + adj[i] = new ArrayList<>(); + } + + createTable(seqs, adj); + + // 计算每个节点的入度 + int[] inDegree = new int[n + 1]; + + for (int i = 1; i <= n; i++) { + for (int j = 0; j < adj[i].size(); j++) { + int w = adj[i].get(j); + inDegree[w]++; + } + } + + // 计算入度为0的节点,添加到队列中 + LinkedList queue = new LinkedList<>(); + for (int i = 1; i <= n; i++) { + if (inDegree[i] == 0) { + queue.addLast(i); + } + } + + // 入度为0的节点有多个,就会产生多种序列,或者没有入度为0的,不满足题目要求 + if (queue.size() != 1) { + return false; + } + + int index = 0; + while (!queue.isEmpty()) { + int num = queue.removeFirst(); + if (org[index] != num) { + return false; + } + index++; + + // 删除当前节点后,所有当前节点的下一个节点的入度为0的个数,超过1则说明序列不唯一 + int nextZeroInDegreeCount = 0; + for (int j = 0; j < adj[num].size(); j++) { + int w = adj[num].get(j); + //遍历邻接表中相邻边的入度都减1 + inDegree[w]--; + if (inDegree[w] == 0) { + nextZeroInDegreeCount++; + //去掉一个结点后,如果入度为0的节点增加了不止1个,说明有多处一个分支,就直接返回false + if (nextZeroInDegreeCount > 1) { + return false; + } + + queue.addLast(w); + } + } + } + + return index == n; + } + + private void createTable(List> seqs, ArrayList[] adj) { + // 构建邻接表 + for (int i = 0; i < seqs.size(); i++) { + List pair = seqs.get(i); + + for (int j = 0; j < pair.size() - 1; j++) { + //数组中链表同样初始化 + adj[pair.get(j)].add(pair.get(j+1)); + } + } + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode464.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode464.java new file mode 100644 index 0000000..b994736 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode464.java @@ -0,0 +1,118 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Map; +import java.util.Set; + +public class LeetCode464 { + + public static void main(String args[]) { + Solution solution = new Solution(); + + System.out.println(solution.canIWin(10, 11)); + +// System.out.println(solution.canIWin(10,12)); + + } + + static class Solution { + + public Set selects = new HashSet(); + + /** + * 1 A -1 B + */ + public int currentSelectPerson = 1; + + public int sum = 0; + + public boolean canIWin(int maxChoosableInteger, int desiredTotal) { + //12 + // 1 9 10 + // 选2 + + //Set集合初始化 + + + //最大和小于目标和返回false + int sumTemp = (1 + maxChoosableInteger) * maxChoosableInteger / 2; + if (sumTemp < desiredTotal) return false; + + + //有序链表 + LinkedList numPools = new LinkedList<>(); + +// for (int i = 1; i <= maxChoosableInteger; i++) { +// numPools.add(i); +// } + + + return canWinCalculate(1, maxChoosableInteger, desiredTotal, new HashMap()); + + } + + /** + * @param i 当前选的值 + * @param maxChoosableInteger + * @param desiredTotal + * @param integerBooleanHashMap + * @return + */ + private boolean canWinCalculate(int i, int maxChoosableInteger, int desiredTotal, HashMap integerBooleanHashMap) { + + for (i = maxChoosableInteger; i > 0; i--) { + selects.clear(); + selects.add(i); + currentSelectPerson = 1; + sum = i; + boolean result = canWinUnit(i, maxChoosableInteger, desiredTotal, integerBooleanHashMap); + if (result) { +// integerBooleanHashMap.put(i, result); + return result; + } + } + + return false; + } + + private boolean canWinUnit(int i, int maxChoosableInteger, int desiredTotal, HashMap integerBooleanHashMap) { + +// if (integerBooleanHashMap.containsKey(i)) { +// return integerBooleanHashMap.get(i); +// } + + boolean result = false; + int prevSum = sum; + +// Set filters = new HashSet(); + for (i = maxChoosableInteger; i > 0; i--) { + if (selects.contains(i)) continue; + selects.add(i); + sum = sum + i; + currentSelectPerson = -currentSelectPerson;//取相反数 + + if (sum >= desiredTotal) { + if (currentSelectPerson == 1) { + result = true; + } + } else { + result = canWinUnit(i, maxChoosableInteger, desiredTotal, integerBooleanHashMap); + } + //底下返回false 继续,返回true 停止 + if (result) { + break; + } else { + //恢复到之前状态 + sum = prevSum; + currentSelectPerson = -currentSelectPerson; + selects.remove(i); + } + } + + return result; + + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode478.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode478.kt new file mode 100644 index 0000000..11f900b --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode478.kt @@ -0,0 +1,24 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + + +fun main() { + val obj = LeetCode478(10.0,0.0,0.0) + + println("结果:${Arrays.toString(obj.randPoint())}") +} +internal class LeetCode478(var rad: Double, var xc: Double, var yc: Double) { + + fun randPoint(): DoubleArray { + val x0 = xc - rad + val y0 = yc - rad + + while (true) { + val xg = x0 + Math.random() * rad * 2.0 + val yg = y0 + Math.random() * rad * 2.0 + if (Math.sqrt(Math.pow(xg - xc, 2.0) + Math.pow(yg - yc, 2.0)) <= rad) + return doubleArrayOf(xg, yg) + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode493.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode493.kt new file mode 100644 index 0000000..e0dbf42 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode493.kt @@ -0,0 +1,82 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + +/** + * 给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。 + * + * 使用归并排序可以求解 + * + * 每次二分后 到最后先比对两个集合是否存在翻转对,然后在进行排序,在每个小的集合中逐渐求逆序对, + * + * 如果因为两个排好序的数组逆序对比较好求,比如A数组中都是递增的,如果其中第i 大于B中的2被,则第i+1 到后面的都是翻转对,也就是size-i个 + * + * + * + */ +fun main() { + val leetCode = LeetCode493() + val leftArray = intArrayOf(3, 4, 5) + val rightArray = intArrayOf(1, 2, 3) + val counts = IntArray(1) +// leetCode.countReverse(leftArray,rightArray,counts) + + val nums = intArrayOf(2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647) + + val numsSize = intArrayOf(2147483647,2147483647,-2147483647,-2147483647,-2147483647,2147483647) + val sortArray = leetCode.mergeSort(nums, 0, nums.size - 1, counts) + println(Arrays.toString(sortArray)) + println(counts[0]) +} + +class LeetCode493 { + + fun mergeSort(nums: IntArray, l: Int, h: Int, counts: IntArray): IntArray { + if (l == h) + return intArrayOf(nums[l]) + + val mid = l + (h - l) / 2 + val leftArr = mergeSort(nums, l, mid, counts) //左有序数组 + val rightArr = mergeSort(nums, mid + 1, h, counts) //右有序数组 + val newNum = IntArray(leftArr.size + rightArr.size) //新有序数组 + + countReverse(leftArr, rightArr, counts) + + var m = 0 + var i = 0 + var j = 0 + /** + * 两个数组 前一半比后一半小 + */ + while (i < leftArr.size && j < rightArr.size) { + newNum[m++] = if (leftArr[i] < rightArr[j]) leftArr[i++] else rightArr[j++] + } + //左边剩余 + while (i < leftArr.size) + newNum[m++] = leftArr[i++] + //右边剩余 + while (j < rightArr.size) + newNum[m++] = rightArr[j++] + + + return newNum + } + + fun countReverse(leftArr: IntArray, rightArr: IntArray, counts: IntArray) { + val leftArrSize = leftArr.size + for (i in rightArr.indices) { +// println("$i") + for (j in leftArr.indices) { +// println("j=$j") + val rightValue = rightArr[i].toLong() + val dRightValue = 2 * rightValue + if (leftArr[j] > dRightValue) { + counts[0] += (leftArrSize - j) +// println("a=$j ${counts[0]}") + break + } + } + } + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode5.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode5.kt new file mode 100644 index 0000000..c705234 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode5.kt @@ -0,0 +1,71 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + +fun main() { + + val s = "abcdssbasdsdf" + + val resultString = findLongest(s) + + println("最大回文子串 ${resultString}") +} + +/** + * +1 0 0 0 0 0 0 1 0 0 0 0 0 +0 1 0 0 0 0 1 0 0 0 0 0 0 +0 0 1 0 0 0 0 0 0 0 0 0 0 +0 0 0 1 0 0 0 0 0 1 0 1 0 +0 0 0 0 1 1 0 0 1 0 1 0 0 +0 0 0 0 1 1 0 0 1 0 1 0 0 +0 1 0 0 0 0 1 0 0 0 0 0 0 +1 0 0 0 0 0 0 1 0 0 0 0 0 +0 0 0 0 1 1 0 0 1 0 1 0 0 +0 0 0 1 0 0 0 0 0 1 0 1 0 +0 0 0 0 1 1 0 0 1 0 1 0 0 +0 0 0 1 0 0 0 0 0 1 0 1 0 +0 0 0 0 0 0 0 0 0 0 0 0 1 +3 11 +最大回文子串 dssbasdsd + */ +fun findLongest(s: String): String { + + val size = s.length + + val array = Array(size) { IntArray(size) } + + var maxLength = 0 + var maxStart = 0 + var maxEnd = 0 + for (i in 0 until s.length) { + for (j in 0 until s.length) { + if (s[i] == s[j]) { + array[i][j] = 1 + if (i != j) { + if ((j - i) > maxLength) { + maxLength = (j - i) + maxStart = i + maxEnd = j + } + } + } + + } + } + + for (i in 0 until s.length) { + for (j in 0 until s.length) { + print(array[i][j]) + print(" ") + } + println() + } + + println("${maxStart} ${maxEnd}") + var resultString = "" + for (i in maxStart..maxEnd) { + resultString += s[i] + } + return resultString +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode582.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode582.java new file mode 100644 index 0000000..c010fb9 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode582.java @@ -0,0 +1,43 @@ +package com.wangpos.datastructure.leetcode; + +import android.os.Build; +import android.support.annotation.RequiresApi; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +public class LeetCode582 { + class Node { + int val; + List children = new ArrayList<>(); + } + + @RequiresApi(api = Build.VERSION_CODES.N) + public List killProcess(List pid, List ppid, int kill) { + HashMap < Integer, List < Integer >> map = new HashMap < > (); + for (int i = 0; i < ppid.size(); i++) { + if (ppid.get(i) > 0) { + + List < Integer > l = map.getOrDefault(ppid.get(i), new ArrayList < Integer > ()); + l.add(pid.get(i)); + map.put(ppid.get(i), l); + } + } + Queue< Integer > queue = new LinkedList< >(); + List < Integer > l = new ArrayList < > (); + queue.add(kill); + while (!queue.isEmpty()) { + int r = queue.remove(); + l.add(r); + if (map.containsKey(r)) + for (int id: map.get(r)) + queue.add(id); + } + return l; + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode6.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode6.kt new file mode 100644 index 0000000..709e818 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode6.kt @@ -0,0 +1,98 @@ +package com.wangpos.datastructure.leetcode + +import android.R.string + + +fun main() { + + val testCase = "LEETCODEISHIRING" + + + val result = convert(testCase, 3) + +// convert(testCase, 10) +// convert(testCase, 11) +// convert(testCase, 12) +// convert(testCase, 13) +// convert(testCase, 14) +// convert(testCase, 15) +// convert(testCase, 16) + println("结果:${result}") +} + + +fun convert(s: String, numRows: Int): String { + + val size = s.length + + if (numRows == 1 || s.length <2) { + return s + } + + //有几个循环单位 + var d = (size - numRows) / (2 * numRows - 2) + + val yushu = (size - numRows) % (2 * numRows - 2) + + + /** + * 每一列 + * + */ + + var result = "" + +// println(d) + var index = 0 + /** + * 判断余数是否满足顶层 + */ + if (yushu >= (2 * numRows - 2) / 2) { + d++ + } + // 层数 + var b = 0 + while (b < numRows) { + var index = 0 + while (index <= d) { + if (b == 0) { + result += s[(numRows - 1) * 2 * index] + } else { + if (index == 0) { + println("2${index} ${d} ${b}") + if(((numRows - 1) * 2 * index + b) Integer.MAX_VALUE) { +// return 0 +// } +// +// if (x < 0) { +// s = "-" + s +// } +// return s.toInt() +// +//} + +fun reverse(x: Int): Int { + var x = x + var ans = 0 + while (x != 0) { + if (ans * 10 / 10 != ans) { + ans = 0 + break + } + ans = ans * 10 + x % 10 + x = x / 10 + } + return ans +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode739.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode739.kt new file mode 100644 index 0000000..3aa65b3 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode739.kt @@ -0,0 +1,63 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* +import kotlin.collections.ArrayList + +/** + * LeetCode 第 739 题:根据每日气温列表,请重新生成一个列表, + * 对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。 + * + * 示例:给定一个数组 T 代表了未来几天里每天的温度值,要求返回一个新的数组 D,D 中的每个元素表示需要经过多少天才能等来温度的升高。 +给定 T:[23, 25, 21, 19, 22, 26, 23] +返回 D: [ 1, 4, 2, 1, 1, 0, 0] + +第一个温度值是 23 摄氏度,它要经过 1 天才能等到温度的升高,也就是在第二天的时候,温度升高到 25 摄氏度,所以对应的结果是 1 +。接下来,从 25 度到下一次温度的升高需要等待 4 天的时间,那时温度会变为 26 度。 + + * + * + * 利用堆栈,还可以解决如下常见问题: +求解算术表达式的结果(LeetCode 224、227、772、770) +求解直方图里最大的矩形区域(LeetCode 84) + + */ +fun main() { + + //最直观的做法就是针对每个温度值向后进行依次搜索,找到比当前温度更高的值,这样的计算复杂度就是 O(n2)。 + + //但是中间有很多重复计算,所以可以使用栈来实现,该方法只需要对数组进行一次遍历,每个元素最多被压入和弹出堆栈一次,算法复杂度是 O(n) + + + val temperature = intArrayOf(23, 25, 21, 19, 22, 26, 23) + + val D = getUpList(temperature) + + println(Arrays.toString(D)) + +} + +fun getUpList(temperature: IntArray): IntArray { + + //存储温度 + val stack = Stack() + + val D = IntArray(temperature.size) + + for (i in temperature.indices) { + val it = temperature[i] + while (!stack.isEmpty()) { + if (temperature[stack.peek()] < it) { + D[stack.peek()] = i - stack.peek() + stack.pop() + }else{ + break + } + } +// stack.push(it) + //栈里面存的是数组下标,如果存值,再计算的时候就不知道是第几个了 + stack.push(i) + + } + + return D +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode8.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode8.kt new file mode 100644 index 0000000..b75a405 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode8.kt @@ -0,0 +1,76 @@ +package com.wangpos.datastructure.leetcode + +fun main() { + + val data = "9223372036854775808" + + val intNum = stringConvertInt(data) + + println("结果;${intNum}") +} + +fun stringConvertInt(str: String): Int { + val str = str.trim() + if (str.length == 0) { + return 0 + } + val isSmallZero = str[0] == '-' + var num: Long = 0 + for (k in 0 until str.length) { + val it = str[k] + + if (k == 0 && it !in '0'..'9') { + if(it !='-' &&it !='+') { + break + } + } + if(str.length>1) { + if ((str[0] == '-'||str[0] == '+') && str[1] !in '0'..'9') { + break + } + + if (it == '0' && str[1] !in '0'..'9') { + break + } + + } + if (it in '0'..'9') { + if(num>Integer.MAX_VALUE){ + break + } + if (num == 0L) { + num = charToInt(it).toLong() + } else { + num = num * 10 + charToInt(it) + } + }else{ + if(k==0 && it!='-'&&it!='+'){ + break + } + if(k!=0){ + break + } + } + } + if (num > Integer.MAX_VALUE) { + if(isSmallZero){ + num = Integer.MAX_VALUE.toLong()+1L + }else{ + num = Integer.MAX_VALUE.toLong() + } + + } + var result = 0 + if (isSmallZero) { + result = -num.toInt() + }else{ + result = num.toInt() + } + return result +} + +private fun charToInt(it: Char): Int { + val result = it.toString().toInt() + println(result) + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode933.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode933.java new file mode 100644 index 0000000..674d08d --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCode933.java @@ -0,0 +1,22 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * 933. 最近的请求次数 + */ +public class LeetCode933 { + + Queue q; + public LeetCode933() { + q = new LinkedList(); + } + + public int ping(int t) { + q.add(t); + while (q.peek() < t - 3000) + q.poll(); + return q.size(); + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCodeTreeArray.java b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCodeTreeArray.java new file mode 100644 index 0000000..cab1482 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/LeetCodeTreeArray.java @@ -0,0 +1,127 @@ +package com.wangpos.datastructure.leetcode; + + +/** + * 树状数组 + * 注意:和“堆”一样,“树状数组”的 00 号索引不放置元素,从 11 号索引开始使用。从上图可以观察到, + * 与数组 C 的某个结点有关的数组 A 的某些结点,它们的索引值之间有如下关系。 + * + * 初始化策略,通过update 方式,update 更新的是差值 + * + * parentIndex = i + lowbit(i); + * + + */ +public class LeetCodeTreeArray { + + int len = 0; + int[] tree; + + /** + * 初始化策略,通过update 方式,update 更新的是差值 + * @param nums + */ + LeetCodeTreeArray(int nums[]) { + this.len = nums.length + 1; + tree = new int[this.len + 1]; + for (int i = 1; i <= len; i++) { + update(i, nums[i-1]); + } + } + + public static void main(String[] args) { + System.out.println("Test"); + + int nums[]= {1,2,3,4,5}; + new LeetCodeTreeArray(nums); + } + + /** + * @param x 返回 2^k 每个tree的下标元素个数 + * @return + */ + public static int lowbit(int x) { + return x & (-x); + } + + /** + * 单点更新 + * + * @param i 原始数组索引 i + * @param delta 变化值 = 更新以后的值 - 原始值 + * + * parent(i)=i+lowbit(i) + * + * 先看 C[3] ,lowbit(3) = 1, 3 + lowbit(3) = 4 就是 C[3] 的父亲结点 C[4] 的索引值。 + * + * 再看 C[4] ,lowbit(4) = 4, 4 + lowbit(4) = 8 就是 C[4] 的父亲结点 C[8] 的索引值。 + + */ + public void update(int i, int delta) { + // 从下到上更新,注意,预处理数组,比原始数组的 len 大 1,故 预处理索引的最大值为 len + //i = 0 位置更新后面的都需要更新 C0 = 原始数据 +变化值 + while (i <= len) { + tree[i] += delta;//当前元素增加delta, tree[i]不管是一系列元素,还是一个元素都是增加一样的 + //获取parent 将parent 同样加上偏移量 + i = getParentIndex(i); + } + } + + private int getParentIndex(int i) { + i += lowbit(i); + return i; + } + + /** + * 查询前缀和 + * + * @param i 前缀的最大索引,即查询区间 [0, i] 的所有元素之和 + */ + public int query(int i) { + // 从右到左查询 + int sum = 0; + while (i > 0) { + sum += tree[i]; + i -= lowbit(i); + } + return sum; + } + +} + + +/** + * + * + * 使用 lowbit 实现“前缀和查询” + * lowbit 可以帮助我们计算前缀和由预处理数组的哪些元素表示。 + * + * 例:计算前 66 个元素的“前缀和”。 + * + * 由“图 3”可以看出前 66 个元素的“前缀和” = C[6] + C[4]。 + * + * 你可以验证一下: + * + * C[6] = C[5] + A[6]、C[5] = A[5],而 C[4] = A[1] + A[2] + A[3] + A[4] 。 + * + * 先看 C[6] ,lowbit(6) = 2, 6 - lowbit(6) = 4 正好是 C[6] 的上一个非叶子结点 C[4] 的索引值。 + * + * 可以这样理解: + * + * 数组 C 的结点的下标表示了数组 C 的元素来自多少个数组 A 的元素,也可以理解成高度,那么上一个非叶子结点,其实就是从右边向左边画一条水平线,遇到的墙的索引值。 + * + * 下面我们使用“前缀和(i)”表示前 i 个元素的“和”。 + * + * 例:计算前 55 个元素的“前缀和”。 + * + * 再看 C[5],lowbit(5) = 1, 5 - lowbit(6) = 4 正好是 C[5] 的上一个非叶子结点 C[4] 的索引值,故“前缀和(5)” = C[5] + C[4]。 + * + * 例:计算前 77 个元素的“前缀和”。 + * + * 再看 C[7],lowbit(7) = 1, 7 - lowbit(7) = 6 正好是 C[7] 的上一个非叶子结点 C[6] 的索引值,“前缀和(7)” = C[7] + C[6] + C[4]。 + * + * 例:计算前 88 个元素的“前缀和”。 + * + * 再看 C[8],lowbit(8) = 8, 8 - lowbit(8) = 0, 0 表示没有,从“图 3”也可以看出从右边向左边画一条水平线,不会遇到的墙,故“前缀和(8)” = C[8]。 + + */ \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/SnakeGame353.java b/app/src/main/java/com/wangpos/datastructure/leetcode/SnakeGame353.java new file mode 100644 index 0000000..285e606 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/SnakeGame353.java @@ -0,0 +1,217 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + + +/** + * 353. 贪吃蛇 + *

+ * 给定 width = 3, height = 2, 食物序列为 food = [[1,2],[0,1]]。 + *

+ * Snake snake = new Snake(width, height, food); + *

+ * 初始时,蛇的位置在 (0,0) 且第一个食物在 (1,2)。 + *

+ * 3,3,[[0,1],[0,2],[1,2],[2,2],[2,1],[2,0],[1,0]]],["R"],["R"],["D"],["D"],["L"],["L"],["U"],["U"],["R"],["R"],["D"],["D"],["L"],["L"],["U"],["R"],["U"],["L"],["D"]] + */ +public class SnakeGame353 { + + Deque snake = new ArrayDeque<>(); + + List bodys = new ArrayList<>(); + + Set snakePositionSet = new HashSet<>(); + int[][] food; + int width; + int height; + + int newfoodIndex = 0; + + int[] lastPosition = new int[2]; + + public static void main(String args[]) { +// int[][] food = new int[][]{new int[]{1, 2}, new int[]{0, 1}}; +// int[][] emptyFood = new int[0][0]; +// SnakeGame353 mainPanel = new SnakeGame353(3, 2, emptyFood); +// int[][] food = new int[][]{new int[]{2, 0}, new int[]{0, 0}, new int[]{0, 2}, new int[]{2, 2}}; + + int[][] food = new int[][]{new int[]{0, 1}, new int[]{0, 2}, new int[]{1, 2}, new int[]{2, 2}, new int[]{2, 1} + , new int[]{2, 0}, new int[]{1, 0} + }; + SnakeGame353 mainPanel = new SnakeGame353(3, 3, food); + + startMove(mainPanel, "R"); + startMove(mainPanel, "R"); + + startMove(mainPanel, "D"); + startMove(mainPanel, "D"); + startMove(mainPanel, "L"); + startMove(mainPanel, "L"); + + startMove(mainPanel, "U"); + startMove(mainPanel, "U"); +// +// + startMove(mainPanel, "R"); + startMove(mainPanel, "R"); +// +// startMove(mainPanel, "D"); +// startMove(mainPanel, "D"); +// startMove(mainPanel, "L"); +// startMove(mainPanel, "L"); +// startMove(mainPanel, "U"); +// startMove(mainPanel, "R"); +// +// startMove(mainPanel,"U"); +// startMove(mainPanel,"L"); +// startMove(mainPanel,"D"); + mainPanel.printSnake(); + } + + private static void startMove(SnakeGame353 leetCode353, String command) { + System.out.println("结果:" + leetCode353.move(command)); + } + + public SnakeGame353(int width, int height, int[][] food) { + this.width = width; + this.height = height; + this.food = food; + + int[] startPosition = getNewPosition(0, 0); +// snake.add(startPosition); + } + + private int[] getNewPosition(int x, int y) { + int[] position = new int[2]; + position[0] = x; + position[1] = y; + return position; + } + + /** + * Moves the snake. + * + * @param direction - 'U' = Up, 'L' = Left, 'R' = Right, 'D' = Down + * @return The game's score after the move. Return -1 if game over. + * Game over when snake crosses the screen boundary or bites its body. + */ + public int move(String direction) { + switch (direction) { + case "U": + if (moveTop(lastPosition)) return -1; + break; + case "L": + if (moveLeft(lastPosition)) return -1; + break; + case "R": + if (moveRight(lastPosition)) return -1; + break; + case "D": + if (moveDown(lastPosition)) return -1; + break; + } + + return bodys.size(); + } + + private boolean moveDown(int[] lastPosition) { + int x = lastPosition[0]; + int y = lastPosition[1] + 1; + if (y < height) { + return move(x, y); + } else { + return true; + } + } + + private boolean checkCrashBody(int x, int y) { + //遍历蛇判断,可以通过HashSet保存蛇位置,然后进行O(1)判断 + for (int[] item : snake) { + if (item[0] == x && item[1] == y) { +// System.out.println("撞到自己身体 Game Over!"); +// System.exit(0); + return true; + } + } + return false; + } + + + private boolean moveRight(int[] lastPosition) { + int x = lastPosition[0] + 1; + int y = lastPosition[1]; + if (x < width) { + return move(x, y); + } else { + return true; + } + } + + private boolean moveLeft(int[] lastPosition) { + int x = lastPosition[0] - 1; + int y = lastPosition[1]; + if (x >= 0) { + return move(x, y); + } else { + return true; + } + } + + private boolean moveTop(int[] lastPosition) { + int x = lastPosition[0]; + int y = lastPosition[1] - 1; + if (y >= 0) { + return move(x, y); + } else { + return true; + } + } + + private boolean move(int x, int y) { + if (checkCrashBody(x, y)) { + return true; + } + int[] position = getNewPosition(x, y); + lastPosition = position; +// snake.addLast(position);//等于 addLast + checkFood(x, y, position); +// printSnake(); + return false; + } + + private void checkFood(int x, int y, int[] position) { + + if (newfoodIndex >= food.length) { + System.out.println("没有食物了"); + snake.addLast(position);//添加头部 + snake.removeFirst();//去掉尾部 空什么也不做 + return; + } + if (food[newfoodIndex][0] == y && food[newfoodIndex][1] == x) { + bodys.add(position); + newfoodIndex++; + snake.addLast(position); + } else { + if (!snake.isEmpty()) { + snake.addLast(position);//添加头部 + snake.removeFirst();//去掉尾部 空什么也不做 + } + } + + } + + private void printSnake() { + System.out.println("snake: "); + for (int[] ints : snake) { + System.out.println(Arrays.toString(ints)); + } + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/Solution1288.java b/app/src/main/java/com/wangpos/datastructure/leetcode/Solution1288.java new file mode 100644 index 0000000..3c03c24 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/Solution1288.java @@ -0,0 +1,59 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.Arrays; +import java.util.Comparator; + +class Solution1288 { + + /** + * 按区间开始排序如下,遍历的时候,只需要记录已遍历区间中的结束的最大值,只要后面的区间结束小于等于最大值, + * 就KO掉。区间开始一样只要保留一个即可。 + * + * 因为开始值我们肯定都是最小的 + * @param intervals + * @return + */ + public int removeCoveredIntervals(int[][] intervals) { + int max2 = 0; + int min1 = 0; + sort(intervals, new int[] {0,1}); + + //保留已遍历的最大的,只要自己2小了,就被删除 + int len = intervals.length; + for (int i = 0; i < intervals.length; i++) { + if(i-1 >= 0 && intervals[i-1][0] == intervals[i][0] && intervals[i-1][1] >=intervals[i][1]){ + len--; + continue; + } + else if(intervals[i][1] <= max2){ + len--; + continue; + }else if (intervals[i][1] > max2){ + max2 = intervals[i][1]; + } + } + return len; + } + + public static void sort(int[][] ob, final int[] order) { + Arrays.sort(ob, new Comparator() { + @Override + public int compare(Object o1, Object o2) { + int[] one = (int[]) o1; + int[] two = (int[]) o2; + for (int i = 0; i < order.length; i++) { + int k = order[i]; + if (one[k] > two[k]) { + return 1; + } else if (one[k] < two[k]) { + return -1; + } else { + continue; //如果按一条件比较结果相等,就使用第二个条件进行比较。 + } + } + return 0; + } + }); + } +} + diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/Test17.java b/app/src/main/java/com/wangpos/datastructure/leetcode/Test17.java new file mode 100644 index 0000000..589f078 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/Test17.java @@ -0,0 +1,64 @@ +package com.wangpos.datastructure.leetcode; + +public class Test17 { + + public static void main() { + int[] nums = new int[]{1, 2, 3, 4}; + int[] count = new Test17().decompressRLElist(nums); + System.out.println(count.length); + } + + public int[] decompressRLElist(int[] nums) { + + int count = 0; + int index = 0; + int[] resultArray; + for (int i = 0; i < nums.length; i++) { + // 0 1 2 3 4 5 + if ((i + 1) % 2 != 0) { + count += nums[i]; + } + } + resultArray = new int[count]; + + for (int i = 0; i < nums.length; i++) { + if ((i + 1) % 2 != 0) { + for (int j = 0; j < nums[i]; j++) { + resultArray[index] = nums[i + 1]; + index++; + } + } + + } + return resultArray; + + } + + public int[][] matrixBlockSum(int[][] mat, int K) { + + int[][] resultArray = new int[mat.length][mat[0].length]; + + for (int i = 0; i < mat.length; i++) { +//i - K <= r <= i + K, j - K <= c <= j + K +// for (int m = 0; m < mat[i].length; m++) { + int aa = i-K; + if(aa<0){ + aa=0; + } + int sum = 0; + for (int a = aa; a <= i + K && a < mat.length; a++) { + int bb = i-K; + if (bb<0){ + bb = 0; + } + for (int b=bb; b <= i + K && b < mat[i].length ; b++) { + sum += mat[a][b]; + } + } +// resultArray[i][m] = sum; +// } + } + + return resultArray; + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/Test17.kt b/app/src/main/java/com/wangpos/datastructure/leetcode/Test17.kt new file mode 100644 index 0000000..0c44ae4 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/Test17.kt @@ -0,0 +1,20 @@ +package com.wangpos.datastructure.leetcode + +import java.util.* + +fun main() { + + val array = arrayOf(1,2,3,4).toIntArray() + val count = Test17().decompressRLElist(array) + +// println(Arrays.toString(count)) +// + val arrayMatrix = arrayOf(arrayOf(1,2,3).toIntArray(), + arrayOf(4,5,6).toIntArray(),arrayOf(7,8,9).toIntArray()) + + val resultArray = Test17().matrixBlockSum(arrayMatrix,1) + + resultArray.forEach { + println(Arrays.toString(it)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/Test18.java b/app/src/main/java/com/wangpos/datastructure/leetcode/Test18.java new file mode 100644 index 0000000..6eac650 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/Test18.java @@ -0,0 +1,32 @@ +package com.wangpos.datastructure.leetcode; + +import java.util.Arrays; + +public class Test18 { + public static void main(String[] args) { + System.out.println("Hello World"); + System.out.println(Arrays.toString(new Test18().getNoZeroIntegers(1010))); + } + + public int[] getNoZeroIntegers(int n) { + + for (int a = 1; a < n; a++) { + int c = n - a; + String as = a+""; + if(as.contains("0")){ + continue; + } + String s = c+""; + if(s.contains("0")){ + continue; + } + int result[] = new int[2]; + result[0] = a; + result[1] = c; + return result; + } + return new int[0]; + } + + +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode/readme.md b/app/src/main/java/com/wangpos/datastructure/leetcode/readme.md new file mode 100644 index 0000000..c4d57bd --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode/readme.md @@ -0,0 +1,43 @@ +LeetCode全部题型 + +- 数组(215) +- 动态规划(176) +- 数学(164) +- 字符串(153) +- 树(125) +- 哈希表(122) +- 深度优先搜索(115) +- 二分查找(82) +- 贪心算法(69) +- 广度优先搜索(63) +- 双指针(60) +- 栈(54) +- 回溯算法(53) +- 设计(43) +- 位运算(41) +- 排序(39) +- 图(38) +- 链表(37) +- 堆(34) +- 并查表(28) +- 滑动窗口(20) +- 分治算法(19) +- 字典树(17) +- 递归(15) +- 线段树(11) #307 #493 +- Ordered Map(10) #220 #352 #846 +- 队列(9) #346 #353 #582 #933 #622 #621 #641 +- 极小化极大(8) +- 树状数组(6) + - 又称 二叉索引树 又以其发明者命名为 Fenwick 树。其初衷是解决数据压缩里的累积频率的计算问题,现多用于高效计算数列的前缀和、区间和它可以以 O(logn) 的时间得到任意前缀和 + 并同时支持在 O(\log n)O(logn) 时间内支持动态单点值的修改。空间复杂度 O(n)O(n)。 + +- LineSweep(6) #1288 #1272 #1229 +- Random(6) +- 拓扑排序(6) #207 #210 #329 #444 #1203 +- 脑筋急转弯(5) #292 +- 几何(5) +- 二叉搜索树(2) #1038 #1214 +- Reject Sampling(2) #478 +- 蓄水池抽样(2) #382 #398 +- 记忆化(1) #329 \ No newline at end of file diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/Cache.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/Cache.java new file mode 100644 index 0000000..3ceed2d --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/Cache.java @@ -0,0 +1,14 @@ +package com.wangpos.datastructure.leetcode2; + +public class Cache { + + T element; + + public void setElement(T element){ + this.element = element; + } + + public T getElement(){ + return element; + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/CacheTest.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/CacheTest.java new file mode 100644 index 0000000..5cb8756 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/CacheTest.java @@ -0,0 +1,57 @@ +package com.wangpos.datastructure.leetcode2; + +import android.util.Log; + +import java.lang.reflect.Field; + +public class CacheTest { + + public static void main(String args[]) { + + Cache cache = new Cache(); + Class eclz = cache.getClass(); + System.out.println("diskCache class is:" + eclz.getName()); + + Field[] fs = eclz.getDeclaredFields(); + for (Field f : fs) { + System.out.println("Field name " + f.getName() + " type:" + f.getType().getName()); + } + + + Character a = 'a'; + Character b = '啊'; + Integer c = 5; + System.out.println(a.SIZE); + System.out.println(b.SIZE); + +// diskCache class is:com.wangpos.datastructure.leetcode2.Cache +// Field name element type:java.lang.Object + + Integer integer1 = new Integer(212); + Integer integer2 = new Integer(212); + + if (integer1 == integer2) { + System.out.println("true"); + }else{ + System.out.println("false"); + } + + String str = null; + + try { + str.toString(); + }catch (Exception e){ + System.out.println("程序异常"); + e.printStackTrace(); + } + + System.out.println("程序执行结束"); + } + + + static class A { + public static void printAContent() { + + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/DiskCache.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/DiskCache.java new file mode 100644 index 0000000..5a87972 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/DiskCache.java @@ -0,0 +1,4 @@ +package com.wangpos.datastructure.leetcode2; + +public class DiskCache extends Cache { +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode220.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode220.java new file mode 100644 index 0000000..9b7030c --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode220.java @@ -0,0 +1,132 @@ +package com.wangpos.datastructure.leetcode2; + +import com.wangpos.datastructure.leetcode.LeetCode464; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; +import java.util.function.Consumer; + +public class LeetCode220 { + public static void main(String args[]) { + Solution solution = new Solution(); + + long nums[] = new long[]{1, 2, 3, 1}; + long nums1[] = new long[]{1, 0, 1, 1}; + long nums2[] = new long[]{1, 5, 9, 1, 5, 9}; + long nums3[] = new long[]{-1, 2147483647}; + int nums4[] = new int[]{2147483647, -2147483647}; +// System.out.println(solution.containsNearbyAlmostDuplicate(nums,3,0)); +// +// System.out.println(solution.containsNearbyAlmostDuplicate(nums1,1,2)); +// System.out.println(solution.containsNearbyAlmostDuplicate(nums2,2,3)); +// System.out.println(solution.containsNearbyAlmostDuplicate(nums3,1,2147483647)); + System.out.println(solution.containsNearbyAlmostDuplicate(nums4, 1, 2147483647)); + +// 报错的两种情况,因为虽然Number 是Float 父类,但是也推断不出来 List list44 是List父类 +// List list4 = new ArrayList(); +// List list44 = new ArrayList(); + + //所以,就算容器里装的东西之间有继承关系,但容器之间是没有继承关系的 + //为了让泛型用起来更舒服,Sun的大脑袋们就想出了的办法,来让”水果盘子“和”苹果盘子“之间发生关系。 +// +// List list11 = new ArrayList(); +// //Integer是Number的子类 +// List list22 = new ArrayList(); +// //Float也是Number的子类 +// List list33 = new ArrayList(); +// +// //上面只能遍历不能添加 获取Number 类型 +// Number a = list11.get(0); // right +// // Integer b = list22.get(0);// Error 只能取出Number 类型 +// // 适合用场景,限制集合的修改操作, 只能获取Number 类型的元素 +// +// +// +// List list = new ArrayList(); +// //Number是Float的父类 +// List list2 = new ArrayList(); +// list2.add(0.1f);//可以调价Float类型,相当于Float 可以复制给Number;子类可以复制给父类 +// Object obj = list2.get(0); +// //Object是Number的父类 +// List list3 = new ArrayList(); +// +// //上面只能添加Float类型,但读出不出来具体类型,只能是Object,限制了集合的使用 +// +//// PECS(Producer Extends Consumer Super)原则,已经很好理解了: +//// +//// 频繁往外读取内容的,适合用上界Extends。 +//// 经常往里插入的,适合用下界Super。 +// Collections.copy(new ArrayList(),new ArrayList()); +// Collections.copy(new ArrayList(),new ArrayList()); +// // Collections.copy(new ArrayList(),new ArrayList());//Error +//// Java中所有类的顶级父类是Object,可以认为Null是所有类的子类。 + + } + + static class Solution { +// public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { +// Set records = new HashSet<>(); +// for (int i = 0; i < nums.length; i++) { +// int maxLength = i + k; +// if (maxLength >= nums.length) maxLength = nums.length-1; +// +// +// for (int j = i+1; j <= maxLength; j++) { +// //去除重复计算 +// if(records.contains(i+"_"+j)) continue; +// long a = nums[i]; +// long b = nums[j]; +// long result = a - b; +// if (Math.abs(result) <= t) { +// return true; +// } +// records.add(i+"_"+j); +// } +// } +// +// return false; +// } + + /** + * TreeSet 实现使用TreeMap ,TreeMap 实现是红黑树,默认自然顺序 + * TreeSet为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。 + * 通过ceiling 和Floor 可以找到最贴近的元素 + * + * @param nums + * @param k + * @param t + * @return + */ + public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { + //自然平衡二叉树,来表示滑动窗口,这个窗口最大size 不能大于k + TreeSet set = new TreeSet<>(); + for (int i = 0; i < nums.length; ++i) { + // Find the successor of current element + + // ceiling(E e) 方法返回在这个集合中大于或者等于给定元素的最小元素,如果不存在这样的元素,返回null. + // 集合中大于此元素的最小值,最小值 + Integer s = set.ceiling(nums[i]); + //s - nums[i]<=t 等式变换得到,集合中满足条件的最小值都不可以,那就其余都不行 + if (s != null && s <= nums[i] + t) return true; + + // 集合中小于此元素的最大值 + // Find the predecessor of current element + Integer g = set.floor(nums[i]); + if (g != null && nums[i] <= g + t) return true; + + //没找到添加到树中,并且会自然平衡 + set.add(nums[i]); + if (set.size() > k) { + //向前数第k个移除 + set.remove(nums[i - k]); + } + } + return false; + } + + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode352.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode352.java new file mode 100644 index 0000000..3a917c5 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode352.java @@ -0,0 +1,140 @@ +package com.wangpos.datastructure.leetcode2; + +import java.util.TreeMap; + +public class LeetCode352 { + + + public static void main(String args[]) { + SummaryRanges summaryRanges = new SummaryRanges(); + summaryRanges.addNum(6); + summaryRanges.addNum(6); + summaryRanges.addNum(0); + summaryRanges.addNum(4); + summaryRanges.addNum(8); + summaryRanges.addNum(7); + summaryRanges.addNum(6); + summaryRanges.addNum(4); + summaryRanges.addNum(7); + summaryRanges.addNum(5); + + int[][] resultArray = summaryRanges.getIntervals(); + for (int[] ints : resultArray) { + System.out.print(ints[0]); + System.out.print(" - "); + System.out.println(ints[1]); + } + + } + + static class SummaryRanges { + + /** + * Initialize your data structure here. + */ + + TreeMap treeMap = new TreeMap<>(); + + public SummaryRanges() { + + } + + public void addNum(int data) { + Integer leftKey = treeMap.floorKey(data); +// System.out.println("左边挨着的Key" + leftKey); + Integer rightKey = treeMap.higherKey(data); +// System.out.println("右边边挨着的Key" + leftKey); + updateData(data, leftKey, rightKey); + + } + + private void updateData(Integer data, Integer leftKey, Integer rightKey) { + boolean leftIsUpdate = false; + boolean rightIsUpdate = false; + if (leftKey != null) { + leftIsUpdate = checkUpdateLeftData(data, leftKey); + } + + if (rightKey != null) { + rightIsUpdate = checkUpdateRightData(data, rightKey); + } + + //有更新去处理合并 + if (leftIsUpdate || rightIsUpdate) { + //前后都有值 + if (leftKey != null && rightKey != null) { + checkMerge(leftKey, rightKey); + } + } + + //都没更新就加入新的 + if (!leftIsUpdate && !rightIsUpdate) { + addNewData(data); + } + } + + private void checkMerge(Integer leftKey, Integer rightKey) { + Integer leftValue = treeMap.get(leftKey); + Integer rightValue = null; + //相同证明不存在需要合并的right + if (leftKey != leftValue) { + rightValue = treeMap.get(leftValue); + } + if (rightValue != null) { + merge(leftKey, leftValue, rightValue); + } + } + + private void addNewData(Integer data) { + treeMap.put(data, data); + } + + private void merge(Integer leftKey, Integer rightKey, Integer rightValue) { + treeMap.put(leftKey, rightValue); + treeMap.remove(rightKey); + } + + private boolean checkUpdateRightData(Integer data, Integer rightKey) { + Integer rightValue = treeMap.get(rightKey); +// System.out.println("右边挨着的值" + rightValue); + + if (data == rightKey) { + return true; + } else if ((data + 1) == rightKey) { + treeMap.put(data, rightValue); + treeMap.remove(rightKey); + return true; + } else { + return false; + } + + } + + private boolean checkUpdateLeftData(int data, Integer leftKey) { + Integer leftValue = treeMap.get(leftKey); +// System.out.println("左边挨着的值" + leftValue); + if (data <= leftValue) { + return true; + } else { + if (data == leftValue + 1) { + treeMap.put(leftKey, data); + return true; + } else { + return false; + } + } + } + + public int[][] getIntervals() { + + int arrays[][] = new int[treeMap.size()][2]; + int index = 0; + for (Integer integer : treeMap.keySet()) { + arrays[index][0] = integer; + arrays[index][1] = treeMap.get(integer); + index++; + } + return arrays; + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode699.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode699.java new file mode 100644 index 0000000..971a18d --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode699.java @@ -0,0 +1,99 @@ +package com.wangpos.datastructure.leetcode2; + +import com.wangpos.datastructure.leetcode.Tree; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.TreeMap; + +public class LeetCode699 { + + public static void main(String args[]) { + Solution solution = new Solution(); + + int[][] positions = new int[][]{new int[]{9, 7}, new int[]{1, 9}, new int[]{3, 1}}; + List resultList = solution.fallingSquares(positions); + System.out.println(Arrays.toString(resultList.toArray())); + } + + static class Solution { + + //X轴每个点对应高度 + HashMap xAxisHeights = new HashMap<>(); + //每个点 + List postionHeights = new ArrayList<>(); + //当前最大高度 + Integer currentMaxHeight = 0; + + TreeMap lineRecords = new TreeMap<>(); + + public List fallingSquares(int[][] positions) { + for (int[] position : positions) { + addPosition(position); + } + return postionHeights; + } + + private void addPosition(int[] position) { + int length = position[0] + position[1]; + int increaseHeight = position[1]; + int coverMaxHeight = 0; + for (int start = position[0]; start <= length; start++) { + Integer oldHeight = xAxisHeights.get(start); + if (oldHeight != null) { + if (oldHeight > coverMaxHeight) { + coverMaxHeight = oldHeight; + } + } + } + int newMaxHeight = coverMaxHeight + increaseHeight; + //去掉两个端点,假设第二块恰好挨着第一块落下端点的高度应该是原先值 + + + Integer leftKey = lineRecords.floorKey(position[0]); + Integer leftValue = lineRecords.get(leftKey); + if (position[0] < leftValue) { + xAxisHeights.put(position[0], newMaxHeight); + } + + Integer rightKey = lineRecords.higherKey(length); + if (length != rightKey) { + xAxisHeights.put(length, newMaxHeight); + } + + + for (int start = position[0] + 1; start < length; start++) { + //判断开始和结束点是否落在边上,还是里面 + xAxisHeights.put(start, newMaxHeight); + } + if (newMaxHeight > currentMaxHeight) { + currentMaxHeight = newMaxHeight; + } + + //计算正方形以单位1的覆盖x 取出所有覆盖点,比较最大高度,最大高度的点值为加上新的点高度,其他点一并更新 + + //更新每个点的高度, + + // 并与当前最高比较如果大于更新currentMaxHeight + + //向posinoHeights记录当前时间点的最大高度 +// int l = position[0]; +// int r = length; +// if (position[0] < leftValue) { +// xAxisHeights.put(leftKey, length);//合并左边 +// l = leftKey; +// } else { +// if(length) +// } + + + lineRecords.put(position[0], position[0] + position[1]); + postionHeights.add(currentMaxHeight); + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode731.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode731.java new file mode 100644 index 0000000..e9fa5cb --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode731.java @@ -0,0 +1,86 @@ +package com.wangpos.datastructure.leetcode2; + +import java.util.TreeMap; + +public class LeetCode731 { + + TreeMap singleMap = new TreeMap<>(); + TreeMap doubleMap = new TreeMap<>(); + + public LeetCode731() { + + } + + public boolean book(int start, int end) { + //返回小于key最大的Key + Integer j = doubleMap.lowerKey(start);//出现两次区间中,起点小于start的 + //大于等于Key的最小Key + Integer k = doubleMap.ceilingKey(start);//出现两次区间中,起点大于等于start的 + if (j != null && doubleMap.get(j) > start) { + return false; + } + if (k != null && k < end) { + return false; + } + Integer a = singleMap.lowerKey(start); + + Integer b = singleMap.ceilingKey(start); + + //完全没有冲突 + //判断开始元素比他小的不存在 + /** + * + * left = a + * + * right = singleMap.get(a) + * + * 新插入的start end 如果不能存在重复 + * + * 则应该瞒住,start 不在这个集合中存在,或者如果存在,start应该大于这个区间的右区间也就是right + * + * 并且,end 不存在,或者小于这个区间left区间 + * + */ + if ((a == null || singleMap.get(a) < start) + && (b == null || b > end)) { + singleMap.put(start, end); + return true; + } + + if (a == null || singleMap.get(a) < start) { + } else { + //与前一个区间有重叠部分,将重叠部分塞入doubleMap,同时在singleMap中合并当前区间和前一个区间 + Integer i = singleMap.get(a); + //区间合并 + singleMap.put(a, Math.max(end, i)); + //存储重复区间 + addDouble(start, Math.min(end, i)); + start = a; + end = Math.max(end, i); + } + + //如果和后一个区间有冲突,冲突区域塞入doubleMap,同时在singleMap中合。 + //需要考虑当前准备插入的区间,同时包含了多个已有区间的情况,所以继续向后找 + //这里应该有优化点,直接查找后一个是比调用higherKey方法来得快的,没仔细想了 + while (b != null && b <= end) { + Integer i = singleMap.get(b); + addDouble(b, Math.min(end, i)); + singleMap.remove(b); + //这里start 如果前一区间重就需要重新合并 + singleMap.put(start, Math.max(end, i)); + end = Math.max(end, i); + //返回大于start最小值 + b = singleMap.higherKey(start); + } + + return true; + } + + public void addDouble(int start, int end) { + if (start >= end) { + return; + } + doubleMap.put(start, end); + } + +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode846.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode846.java new file mode 100644 index 0000000..8e7fe84 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/LeetCode846.java @@ -0,0 +1,73 @@ +package com.wangpos.datastructure.leetcode2; + +import android.annotation.TargetApi; +import android.os.Build; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +public class LeetCode846 { + + class Solution { + public boolean isNStraightHand(int[] hand, int W) { + + //排序 + Arrays.sort(hand); + int len = hand.length; + if (len % W != 0) { + return false; + } + + //将数组添加到列表中,方便移除 + List list = new ArrayList<>(); + for (int i = 0; i < len; i++) { + list.add(hand[i]); + } + + while (list.size() > 0) { + + Integer curVal = list.get(0); + for (int i = 0; i < W; i++) { + if (list.size() == 0) + return false; + if (!list.remove(curVal)) + return false; + curVal++; + } + } + + return true; + + } + + @TargetApi(Build.VERSION_CODES.N) + public boolean isNStraightHand2(int[] hand, int W){ + //通过TreeMap实现数组的排序,并记录元素出现的次数 + TreeMap count = new TreeMap(); + for (int card: hand) { + if (!count.containsKey(card)) + count.put(card, 1); + else + count.replace(card, count.get(card) + 1); + } + + while (count.size() > 0) { + //读取第一个数组 + int first = count.firstKey(); + for (int card = first; card < first + W; ++card) { + //不够直接返回fasle + if (!count.containsKey(card)) return false; + int c = count.get(card); + if (c == 1) count.remove(card); + else count.replace(card, c - 1); + } + } + + return true; + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/TestReentranlock.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/TestReentranlock.java new file mode 100644 index 0000000..67ec567 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/TestReentranlock.java @@ -0,0 +1,129 @@ +package com.wangpos.datastructure.leetcode2; + +import com.wangpos.datastructure.java.condition.BoundedBuffer; + +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class TestReentranlock { + + public static void main(String args[]) { + final BoundedBuffer bb = new BoundedBuffer(); + + Thread t1 = new Thread() { + @Override + public void run() { + super.run(); + try { + while (true) { + System.out.println("准备写入数据"); + bb.put(new Object()); + System.out.println("写入数据完成"); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + t1.start(); + + + Thread t3 = new Thread() { + @Override + public void run() { + super.run(); + try { + while (true) { + System.out.println("准备写入数据3"); + bb.put(new Object()); + System.out.println("写入数据完成3"); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + t3.start(); + + Thread t2 = new Thread() { + @Override + public void run() { + super.run(); + try { + sleep(2000); + System.out.println("准备读出数据......"); + bb.take(); + System.out.println("读出数据完成....."); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + t2.start(); + } + + /** + * 准备写入数据 + * 队列未满 + * 准备唤醒读线程 + * 写入数据完成 + * 准备写入数据 + * 队列满了 + * 准备读出数据...... + * 准备唤醒写线程 + * 读出数据完成..... + * 队列满了1 + * 队列未满 + * 准备唤醒读线程 + * 写入数据完成 + * 准备写入数据 + * 队列满了 + */ + static class BoundedBuffer { + final Lock lock = new ReentrantLock();//锁对象 + final Condition notFull = lock.newCondition();//写线程条件 + final Condition notEmpty = lock.newCondition();//读线程条件 + + final Object[] items = new Object[1];//缓存队列 + int putptr/*写索引*/, takeptr/*读索引*/, count/*队列中存在的数据个数*/; + + public void put(Object x) throws InterruptedException { + lock.lock(); + try { + while (count == items.length) {//如果队列满了 + System.out.println("队列满了"); + notFull.await();//阻塞写线程 + //被唤醒后执行,及时多个限制再阻塞,拿到锁的也只有一个,所以只会唤醒一个 + System.out.println("队列满了1》》》》》》》》》》》》》》》》》》》"); + } + System.out.println("队列未满"); + items[putptr] = x;//赋值 + if (++putptr == items.length) putptr = 0;//如果写索引写到队列的最后一个位置了,那么置为0 + ++count;//个数++ + System.out.println("准备唤醒读线程"); + notEmpty.signal();//唤醒读线程 + } finally { + lock.unlock(); + } + } + + public Object take() throws InterruptedException { + lock.lock(); + try { + while (count == 0) {//如果队列为空 + System.out.println("队列为空"); + notEmpty.await();//阻塞读线程 + } + Object x = items[takeptr];//取值 + if (++takeptr == items.length) takeptr = 0;//如果读索引读到队列的最后一个位置了,那么置为0 + --count;//个数-- + System.out.println("准备唤醒写线程"); + notFull.signal();//唤醒写线程 + return x; + } finally { + lock.unlock(); + } + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/TestSort.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/TestSort.java new file mode 100644 index 0000000..9387f41 --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/TestSort.java @@ -0,0 +1,31 @@ +package com.wangpos.datastructure.leetcode2; + +public class TestSort { + + public static int[] mergeSort(int[] nums, int l, int h) { + if (l == h) + return new int[] { nums[l] }; + + int mid = l + (h - l) / 2; + int[] leftArr = mergeSort(nums, l, mid); //左有序数组 + int[] rightArr = mergeSort(nums, mid + 1, h); //右有序数组 + int[] newNum = new int[leftArr.length + rightArr.length]; //新有序数组 + + int m = 0, i = 0, j = 0; + while (i < leftArr.length && j < rightArr.length) { + newNum[m++] = leftArr[i] < rightArr[j] ? leftArr[i++] : rightArr[j++]; + } + while (i < leftArr.length) + newNum[m++] = leftArr[i++]; + while (j < rightArr.length) + newNum[m++] = rightArr[j++]; + return newNum; + } + public static void main(String[] args) { + int[] nums = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 10 }; + int[] newNums = mergeSort(nums, 0, nums.length - 1); + for (int x : newNums) { + System.out.println(x); + } + } +} diff --git a/app/src/main/java/com/wangpos/datastructure/leetcode2/Trie.java b/app/src/main/java/com/wangpos/datastructure/leetcode2/Trie.java new file mode 100644 index 0000000..8b1909d --- /dev/null +++ b/app/src/main/java/com/wangpos/datastructure/leetcode2/Trie.java @@ -0,0 +1,150 @@ +package com.wangpos.datastructure.leetcode2; + + +public class Trie { + private int SIZE = 26; + private TrieNode root;//字典树的根 + + Trie() //初始化字典树 + { + root = new TrieNode(); + } + + private class TrieNode //字典树节点 + { + private int num;//有多少单词通过这个节点,即由根至该节点组成的字符串模式出现的次数 + private TrieNode[] son;//所有的儿子节点 + private boolean isEnd;//是不是最后一个节点 + private char val;//节点的值 + private boolean haveSon; + + TrieNode() { + num = 1; + son = new TrieNode[SIZE]; + isEnd = false; + haveSon = false; + } + } + + //建立字典树 + public void insert(String str) //在字典树中插入一个单词 + { + if (str == null || str.length() == 0) { + return; + } + TrieNode node = root; + char[] letters = str.toCharArray(); + for (int i = 0, len = str.length(); i < len; i++) { + int pos = letters[i] - 'a'; + if (node.son[pos] == null) { + node.haveSon = true; + node.son[pos] = new TrieNode(); + node.son[pos].val = letters[i]; + } else { + node.son[pos].num++; + } + node = node.son[pos]; + } + node.isEnd = true; + } + + //计算单词前缀的数量 + public int countPrefix(String prefix) { + if (prefix == null || prefix.length() == 0) { + return -1; + } + TrieNode node = root; + char[] letters = prefix.toCharArray(); + for (int i = 0, len = prefix.length(); i < len; i++) { + int pos = letters[i] - 'a'; + if (node.son[pos] == null) { + return 0; + } else { + node = node.son[pos]; + } + } + return node.num; + } + + //打印指定前缀的单词 + public String hasPrefix(String prefix) { + if (prefix == null || prefix.length() == 0) { + return null; + } + TrieNode node = root; + char[] letters = prefix.toCharArray(); + for (int i = 0, len = prefix.length(); i < len; i++) { + int pos = letters[i] - 'a'; + if (node.son[pos] == null) { + return null; + } else { + node = node.son[pos]; + } + } + preTraverse(node, prefix); + return null; + } + + // 遍历经过此节点的单词. + public void preTraverse(TrieNode node, String prefix) { + if (node.haveSon) { + for (TrieNode child : node.son) { + if (child != null) { + preTraverse(child, prefix + child.val); + } + } + return; + } + System.out.println(prefix); + } + + + //在字典树中查找一个完全匹配的单词. + public boolean has(String str) { + if (str == null || str.length() == 0) { + return false; + } + TrieNode node = root; + char[] letters = str.toCharArray(); + for (int i = 0, len = str.length(); i < len; i++) { + int pos = letters[i] - 'a'; + if (node.son[pos] != null) { + node = node.son[pos]; + } else { + return false; + } + } + return node.isEnd; + } + + //前序遍历字典树. + public void preTraverse(TrieNode node) { + if (node != null) { + System.out.print(node.val + "-"); + for (TrieNode child: node.son) { + preTraverse(child); + } + } + } + + public TrieNode getRoot() { + return this.root; + } + + public static void main(String[] args) { + Trie tree = new Trie(); + String[] strs = {"banana", "band", "bee", "absolute", "acm",}; + String[] prefix = {"ba", "b", "band", "abc",}; + for (String str: strs) { + tree.insert(str); + } + System.out.println(tree.has("abc")); + tree.preTraverse(tree.getRoot()); + System.out.println(); +// tree.printAllWords(); + for (String pre: prefix) { + int num = tree.countPrefix(pre); + System.out.println(pre + "" + num); + } + } +} \ No newline at end of file diff --git a/codeview/codeview.iml b/codeview/codeview.iml deleted file mode 100755 index 413ce95..0000000 --- a/codeview/codeview.iml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index aac7c9b..0000000 --- a/gradle.properties +++ /dev/null @@ -1,17 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true diff --git a/local.properties b/local.properties deleted file mode 100644 index 0890af2..0000000 --- a/local.properties +++ /dev/null @@ -1,10 +0,0 @@ -## This file is automatically generated by Android Studio. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file should *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. -# -# Location of the SDK. This is only used by Gradle. -# For customization when using a Version Control System, please read the -# header note. -sdk.dir=/Users/qiyue/Library/Android/sdk \ No newline at end of file diff --git a/sources/binearyTree.md b/sources/binearyTree.md new file mode 100644 index 0000000..84888c4 --- /dev/null +++ b/sources/binearyTree.md @@ -0,0 +1,13 @@ +### 二叉树的性质 + + +若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点: + +(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点;   + +(2) 若 2i>n,则该结点无左孩子,  否则,编号为 2i 的结点为其左孩子结点; + +(3) 若 2i+1>n,则该结点无右孩子结点,  否则,编号为2i+1 的结点为其右孩子结点。 + + +**注意 编号是从1开始才有这个关系,如果是从0开始就不满住这个关系,所以切记 \ No newline at end of file diff --git a/sources/blockcanary.md b/sources/blockcanary.md new file mode 100644 index 0000000..4557bca --- /dev/null +++ b/sources/blockcanary.md @@ -0,0 +1,185 @@ +BlockCanary原理分析 + +BlockCanary是国内开发者MarkZhai开发的一套性能监控组件,它对主线程操作进行了完全透明的监控,并能输出有效的信息,帮助开发分析、定位到问题所在,迅速优化应用。 + +1.基本使用 +使用非常方便,引入 + +dependencies { + + compile 'com.github.markzhai:blockcanary-android:1.5.0' + + // 仅在debug包启用BlockCanary进行卡顿监控和提示的话,可以这么用 + debugCompile 'com.github.markzhai:blockcanary-android:1.5.0' + releaseCompile 'com.github.markzhai:blockcanary-no-op:1.5.0' +} + + +在应用的application中完成初始化 + +public class DemoApplication extends Application { + + @Override + public void onCreate() { + super.onCreate(); + BlockCanary.install(this, new AppContext()).start(); + } +} + +//参数设置 +public class AppContext extends BlockCanaryContext { + private static final String TAG = "AppContext"; + + @Override + public String provideQualifier() { + String qualifier = ""; + try { + PackageInfo info = DemoApplication.getAppContext().getPackageManager() + .getPackageInfo(DemoApplication.getAppContext().getPackageName(), 0); + qualifier += info.versionCode + "_" + info.versionName + "_YYB"; + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "provideQualifier exception", e); + } + return qualifier; + } + + @Override + public int provideBlockThreshold() { + return 500; + } + + @Override + public boolean displayNotification() { + return BuildConfig.DEBUG; + } + + @Override + public boolean stopWhenDebugging() { + return false; + } +} + + + + +2、基本原理 +我们都知道Android应用程序只有一个主线程ActivityThread,这个主线程会创建一个Looper(Looper.prepare),而Looper又会关联一个MessageQueue,主线程Looper会在应用的生命周期内不断轮询(Looper.loop),从MessageQueue取出Message 更新UI。 +我们来看一个代码片段 + +public static void loop() { + ... + for (;;) { + ... + // This must be in a local variable, in case a UI event sets the logger + Printer logging = me.mLogging; + if (logging != null) { + logging.println(">>>>> Dispatching to " + msg.target + " " + + msg.callback + ": " + msg.what); + } + msg.target.dispatchMessage(msg); + if (logging != null) { + logging.println("<<<<< Finished to " + msg.target + " " + msg.callback); + } + ... + } +} + + + +msg.target其实就是Handler,看一下dispatchMessage的逻辑 + +/** + * Handle system messages here. + */ +public void dispatchMessage(Message msg) { + if (msg.callback != null) { + handleCallback(msg); + } else { + if (mCallback != null) { + if (mCallback.handleMessage(msg)) { + return; + } + } + handleMessage(msg); + } +} + + +即调用BlockCanary的start方法 + +public void start() { + if (!mMonitorStarted) { + mMonitorStarted = true; + Looper.getMainLooper().setMessageLogging(mBlockCanaryCore.monitor); + } +} + +* 如果消息是通过Handler.post(runnable)方式投递到MQ中的,那么就回调runnable#run方法; +* 如果消息是通过Handler.sendMessage的方式投递到MQ中,那么回调handleMessage方法; +不管是哪种回调方式,回调一定发生在UI线程。因此如果应用发生卡顿,一定是在dispatchMessage中执行了耗时操作。我们通过给主线程的Looper设置一个Printer,打点统计dispatchMessage方法执行的时间,如果超出阀值,表示发生卡顿,则dump出各种信息,提供开发者分析性能瓶颈。 + +@Override +public void println(String x) { + if (!mStartedPrinting) { + mStartTimeMillis = System.currentTimeMillis(); + mStartThreadTimeMillis = SystemClock.currentThreadTimeMillis(); + mStartedPrinting = true; + startDump(); + } else { + final long endTime = System.currentTimeMillis(); + mStartedPrinting = false; + if (isBlock(endTime)) { + notifyBlockEvent(endTime); + } + stopDump(); + } +} + +private boolean isBlock(long endTime) { + return endTime - mStartTimeMillis > mBlockThresholdMillis; +} + + +private void startDump() { +//收集栈信息 + if (null != BlockCanaryCore.get().threadStackSampler) { + BlockCanaryCore.get().threadStackSampler.start(); + } + + if (null != BlockCanaryCore.get().cpuSampler) { + BlockCanaryCore.get().cpuSampler.start(); + } +} + +private void stopDump() { + if (null != BlockCanaryCore.get().threadStackSampler) { + BlockCanaryCore.get().threadStackSampler.stop(); + } + + if (null != BlockCanaryCore.get().cpuSampler) { + BlockCanaryCore.get().cpuSampler.stop(); + } +} +//具体收集算法 + + protected void doSample() { +// Log.d("BlockCanary", "sample thread stack: [" + mThreadStackEntries.size() + ", " + mMaxEntryCount + "]"); + StringBuilder stringBuilder = new StringBuilder(); + + // Fetch thread stack info + for (StackTraceElement stackTraceElement : mThread.getStackTrace()) { + stringBuilder.append(stackTraceElement.toString()) + .append(Block.SEPARATOR); + } + + // Eliminate obsolete entry + synchronized (mThreadStackEntries) { + if (mThreadStackEntries.size() == mMaxEntryCount && mMaxEntryCount > 0) { + mThreadStackEntries.remove(mThreadStackEntries.keySet().iterator().next()); + } + mThreadStackEntries.put(System.currentTimeMillis(), stringBuilder.toString()); + } + } + + + diff --git a/sources/matrix_table.md b/sources/matrix_table.md new file mode 100644 index 0000000..16ae175 --- /dev/null +++ b/sources/matrix_table.md @@ -0,0 +1,43 @@ +### 邻接矩阵和邻接表比较 + + +1. 邻接矩阵 + +图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。 +设图G有n个顶点,则邻接矩阵是一个n*n的方阵 + +无向图的边数组是一个对称矩阵。所谓对称矩阵就是n阶矩阵的元满足aij = aji。 +即从矩阵的左上角到右下角的主对角线为轴,右上角的元和左下角相对应的元全都是相等的 + +- 从这个矩阵中,很容易知道图中的信息。 + +(1)要判断任意两顶点是否有边无边就很容易了; +(2)要知道某个顶点的度,其实就是这个顶点vi在邻接矩阵中第i行或(第i列)的元素之和; +(3)求顶点vi的所有邻接点就是将矩阵中第i行元素扫描一遍,arc[i][j]为1就是邻接点; + + +2. 邻接表 + + 一般是 数组结构,每个数组中 对应一个单链表结构;因此这种数组与链表相结合的存储方法称为邻接表 + + + 邻接表的处理方法是这样的: + + (1)图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过,数组可以较容易的读取顶点的信息,更加方便。 + + (2)图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以,用单链表存储,无向图称为顶点vi的边表,有向图则 + + (3)顶点表的各个结点由data和firstedge两个域表示,data是数据域,存储顶点的信息,firstedge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。 + + (4)边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指向边表中下一个结点的指针。 + 对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可。 + + +3. 两者区别 + + 对于一个具有n个顶点e条边的无向图 + 它的邻接表表示有n个顶点表结点2e个边表结点 + 对于一个具有n个顶点e条边的有向图 + 它的邻接表表示有n个顶点表结点e个边表结点 + 如果图中边的数目远远小于n2称作稀疏图,这是用邻接表表示比用邻接矩阵表示节省空间; + 如果图中边的数目接近于n2,对于无向图接近于n*(n-1)称作稠密图,考虑到邻接表中要附加链域,采用邻接矩阵表示法为宜。 \ No newline at end of file diff --git a/sources/seven_design_principles.md b/sources/seven_design_principles.md index 9852064..da30f8c 100644 --- a/sources/seven_design_principles.md +++ b/sources/seven_design_principles.md @@ -7,12 +7,73 @@ 核心思想:对扩展开放,对修改关闭。 即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,这样兼容性更好 + + 书籍接口: + + public interface IBook{ + public String getName(); + public String getPrice(); + public String getAuthor(); + } + 小说类书籍: + + public class NovelBook implements IBook{ + private String name; + private int price; + private String author; + public NovelBook(String name,int price,String author){ + this.name = name; + this.price = price; + this.author = author; + } + public String getAutor(){ + return this.author; + } + + public String getName(){ + return this.name; + } + + public int getPrice(){ + return this.price; + } + } + Client类: + + public class Client{ + public static void main(Strings[] args){ + IBook novel = new NovelBook("笑傲江湖",100,"金庸"); + System.out.println( + "书籍名字:"+novel.getName()+ + "书籍作者:"+novel.getAuthor()+ + "书籍价格:"+novel.getPrice() + ); + } + } + 项目投入使用后,书籍正常销售,但是我们经常因为各种原因,要打折来销售书籍,这是一个变化,我们要如何应对这样一个需求变化呢? + + 我们有下面三种方法可以解决此问题: + + 修改接口 + 在IBook接口中,增加一个方法getOffPrice(),专门用于进行打折处理,所有的实现类实现此方法。但是对于这样的一个修改方式,首先,作为接口,IBook应该稳定且可靠,不应该经常发生改变,否则接口作为契约的作用就失去了。其次,并不是所有的书籍都需要打折销售,仅仅因为NovelBook打折销售就修改接口使所有书都必须实现打折销售的逻辑,显然与实际业务不符。因此,此方案否定。 + + 修改实现类 + 修改NovelBook类的方法,直接在getPrice()方法中实现打折处理。此方法是有问题的,例如我们如果getPrice()方法中只需要读取书籍的打折前的价格呢?这不是有问题吗?当然我们也可以再增加getOffPrice()方法,这也是可以实现其需求,但是这就有二个读取价格的方法,因此,该方案也不是一个最优方案。 + + 通过扩展实现变化 + 我们可以增加一个子类OffNovelBook(继承自NovelBook),覆写getPrice()方法。此方法修改少,对现有的代码没有影响,风险少,是最好的办法,同时也符合开闭原则。 + + 下面是修改后的类图: + + 2、 里氏替换原则 在任何父类出现的地方都可以用他的子类来替代(子类应当可以替换父类,并出现在父类能够出现的任何地方) + 只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。 + 3、 单一职责原则