From 411f366e7ee07bb274f7400edf0277e1f4fcc485 Mon Sep 17 00:00:00 2001 From: LuoHaiYang Date: 2020年8月17日 11:50:10 +0800 Subject: [PATCH 01/16] =?UTF-8?q?[A]=20=E6=B7=BB=E5=8A=A0leetcode=E9=A2=98?= =?UTF-8?q?=E8=A7=A3=EF=BC=9A=E9=80=86=E5=BA=8F=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../algorithm/leetcode/ReversePairs.java | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 src/main/java/com/bruis/algorithminjava/algorithm/leetcode/ReversePairs.java diff --git a/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/ReversePairs.java b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/ReversePairs.java new file mode 100644 index 0000000..86a01a1 --- /dev/null +++ b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/ReversePairs.java @@ -0,0 +1,150 @@ +package com.bruis.algorithminjava.algorithm.leetcode; + +import java.util.Arrays; + +/** + * 逆序对 + *

+ * url: https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ + * + * @author LuoHaiYang + */ +public class ReversePairs { + + /* ================================ 解法一 ================================*/ + + /** + * 暴力解法O(n^2),超时 + * + * @param nums + * @return + */ + public int reversePairs2(int[] nums) { + int n = nums.length; + if (n < 2) { + return 0; + } + int reverseNum = 0; + for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { + if (nums[i]> nums[j]) { + reverseNum++; + } + } + } + return reverseNum; + } + + /* ================================ 解法二 ================================*/ + + /** + * 使用自顶向下的归并排序算法计算逆序对,用来额外的空间。 + * + * @param nums + * @return + */ + public int reversePairs(int[] nums) { + int n = nums.length; + if (n < 2) { + return 0; + } + return getReversePairs(nums); + } + + private int getReversePairs(int[] nums) { + int n = nums.length; + return getReversePairs(nums, 0, n - 1); + } + + private int getReversePairs(int[] nums, int left, int right) { + if (left>= right) { + return 0; + } + int result = 0; + int mid = (left + right) / 2; + result += getReversePairs(nums, left, mid) + getReversePairs(nums, mid + 1, right) + reversePairs(nums, left, mid, right); + return result; + } + + private int reversePairs(int[] nums, int left, int mid, int right) { + int[] aux = Arrays.copyOfRange(nums, left, right + 1); + int i = left, j = mid + 1; + + int res = 0; + + for (int k = left; k <= right; k++) { + if (i> mid) { + nums[k] = aux[j - left]; + j++; + } else if (j> right) { + nums[k] = aux[i - left]; + i++; + } else if (aux[i - left] <= aux[j - left]) { + nums[k] = aux[i - left]; + i++; + } else { + nums[k] = aux[j - left]; + j++; + res += (mid - i) + 1; + } + } + return res; + } + + /* ================================ 题解三(优化) ================================*/ + + /** + * @param nums + * @return + */ + public int reversePairs3(int[] nums) { + if (nums == null || nums.length < 2) + return 0; + int[] temp = new int[nums.length]; + System.arraycopy(nums, 0, temp, 0, nums.length); + + int count = mergeCount(nums, temp, 0, nums.length - 1); + return count; + } + + private int mergeCount(int[] nums, int[] temp, int start, int end) { + if (start>= end) { + return 0; + } + + int mid = (start + end)>> 1; + int left = mergeCount(temp, nums, start, mid); + int right = mergeCount(temp, nums, mid + 1, end); + int count = 0; + + //merge() + int i = mid;//遍历左区域指针 + int j = end;//遍历右区域指针 + + int k = end;//临时区域指针 + while (i>= start && j>= mid + 1) { + if (nums[i]> nums[j]) { + count += j - mid; + temp[k--] = nums[i--]; + } else { + temp[k--] = nums[j--]; + } + } + //如果还有剩下没遍历的 + while (i>= start) + temp[k--] = nums[i--]; + while (j>= mid + 1) + temp[k--] = nums[j--]; + + return count + left + right; + } + + public static void main(String[] args) { + ReversePairs reversePairs = new ReversePairs(); + int[] nums = {7, 5, 6, 4}; + //int[] nums = {1,3,2,3,1}; + System.out.println(reversePairs.reversePairs3(nums)); + } + + +} From 0e4aeb836e490a755642d384f65a2bea71e2214b Mon Sep 17 00:00:00 2001 From: LuoHaiYang Date: 2020年8月18日 09:51:25 +0800 Subject: [PATCH 02/16] =?UTF-8?q?[A]=20=E6=B7=BB=E5=8A=A0=E9=A2=9C?= =?UTF-8?q?=E8=89=B2=E6=8E=92=E5=BA=8F=E9=A2=98=E8=A7=A3;=20[U]=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0readme=E7=9B=AE=E5=BD=95=E5=86=85=E5=AE=B9?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++--- notes/leetcode/ReversePairs.md | 3 + .../array/MaximumProductSubarray.java | 2 +- .../leetcode/{ => array}/ReversePairs.java | 43 +++++++++++--- .../algorithm/leetcode/array/SortColors.java | 56 +++++++++++++++++++ .../array/SubarraySumEqualsK.java | 2 +- .../{ => leetcode}/array/ThreeSum.java | 2 +- .../{ => leetcode}/array/TwoSum.java | 2 +- 8 files changed, 106 insertions(+), 20 deletions(-) create mode 100644 notes/leetcode/ReversePairs.md rename src/main/java/com/bruis/algorithminjava/algorithm/{ => leetcode}/array/MaximumProductSubarray.java (96%) rename src/main/java/com/bruis/algorithminjava/algorithm/leetcode/{ => array}/ReversePairs.java (79%) create mode 100644 src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/SortColors.java rename src/main/java/com/bruis/algorithminjava/algorithm/{ => leetcode}/array/SubarraySumEqualsK.java (98%) rename src/main/java/com/bruis/algorithminjava/algorithm/{ => leetcode}/array/ThreeSum.java (98%) rename src/main/java/com/bruis/algorithminjava/algorithm/{ => leetcode}/array/TwoSum.java (97%) diff --git a/README.md b/README.md index ba459e8..43ecc07 100644 --- a/README.md +++ b/README.md @@ -80,20 +80,18 @@ 题目名称 | 难度 | 地址 | 题解 ---|---|---|--- -两数之和 | 简单 | [https://leetcode-cn.com/problems/two-sum/](https://leetcode-cn.com/problems/two-sum/) | a -三数之和 | 中等 | [https://leetcode-cn.com/problems/3sum/](https://leetcode-cn.com/problems/3sum/) | a -乘积最大子数组 | 中等 | [https://leetcode-cn.com/problems/maximum-product-subarray/](https://leetcode-cn.com/problems/maximum-product-subarray/) | b -和为K的子数组 | 中等 | [https://leetcode-cn.com/problems/subarray-sum-equals-k/](https://leetcode-cn.com/problems/subarray-sum-equals-k/) | c - -数组类总数:4 +两数之和 | 简单 | [https://leetcode-cn.com/problems/two-sum/](https://leetcode-cn.com/problems/two-sum/) | [题解](https://github.com/coderbruis/AlgorithmsInJava/blob/master/src/main/java/com/bruis/algorithminjava/algorithm/array/TwoSum.java) +三数之和 | 中等 | [https://leetcode-cn.com/problems/3sum/](https://leetcode-cn.com/problems/3sum/) | [题解](https://github.com/coderbruis/AlgorithmsInJava/blob/master/src/main/java/com/bruis/algorithminjava/algorithm/array/ThreeSum.java) +乘积最大子数组 | 中等 | [https://leetcode-cn.com/problems/maximum-product-subarray/](https://leetcode-cn.com/problems/maximum-product-subarray/) | [题解](https://github.com/coderbruis/AlgorithmsInJava/blob/master/src/main/java/com/bruis/algorithminjava/algorithm/array/MaximumProductSubarray.java) +和为K的子数组 | 中等 | [https://leetcode-cn.com/problems/subarray-sum-equals-k/](https://leetcode-cn.com/problems/subarray-sum-equals-k/) | [题解](https://github.com/coderbruis/AlgorithmsInJava/blob/master/src/main/java/com/bruis/algorithminjava/algorithm/array/SubarraySumEqualsK.java) +逆序对 | 中等 | [https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/](https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/) | [题解](https://github.com/coderbruis/AlgorithmsInJava/blob/master/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/ReversePairs.java) +颜色分类 | 中等 | [https://leetcode-cn.com/problems/sort-colors/](https://leetcode-cn.com/problems/sort-colors/) | [题解](https://github.com/coderbruis/AlgorithmsInJava/blob/master/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/sort-colors.java) ## 2. 堆栈 题目名称 | 难度 | 地址 | 题解 ---|---|---|--- -最小栈 | 简单 | [https://leetcode-cn.com/problems/min-stack/](https://leetcode-cn.com/problems/min-stack/) | a - -堆栈类总数:1 +最小栈 | 简单 | [https://leetcode-cn.com/problems/min-stack/](https://leetcode-cn.com/problems/min-stack/) | [题解](https://github.com/coderbruis/AlgorithmsInJava/blob/master/src/main/java/com/bruis/algorithminjava/algorithm/stack/MinStack.java) ## 3. 链表 diff --git a/notes/leetcode/ReversePairs.md b/notes/leetcode/ReversePairs.md new file mode 100644 index 0000000..7368349 --- /dev/null +++ b/notes/leetcode/ReversePairs.md @@ -0,0 +1,3 @@ +``` + +``` \ No newline at end of file diff --git a/src/main/java/com/bruis/algorithminjava/algorithm/array/MaximumProductSubarray.java b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/MaximumProductSubarray.java similarity index 96% rename from src/main/java/com/bruis/algorithminjava/algorithm/array/MaximumProductSubarray.java rename to src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/MaximumProductSubarray.java index 2df3ade..b0785f4 100644 --- a/src/main/java/com/bruis/algorithminjava/algorithm/array/MaximumProductSubarray.java +++ b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/MaximumProductSubarray.java @@ -1,4 +1,4 @@ -package com.bruis.algorithminjava.algorithm.array; +package com.bruis.algorithminjava.algorithm.leetcode.array; /** * @author LuoHaiYang diff --git a/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/ReversePairs.java b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/ReversePairs.java similarity index 79% rename from src/main/java/com/bruis/algorithminjava/algorithm/leetcode/ReversePairs.java rename to src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/ReversePairs.java index 86a01a1..fc2d98c 100644 --- a/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/ReversePairs.java +++ b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/ReversePairs.java @@ -1,4 +1,4 @@ -package com.bruis.algorithminjava.algorithm.leetcode; +package com.bruis.algorithminjava.algorithm.leetcode.array; import java.util.Arrays; @@ -94,12 +94,16 @@ private int reversePairs(int[] nums, int left, int mid, int right) { /* ================================ 题解三(优化) ================================*/ /** + * + * 相比解法二时间复杂度常数和空间复杂度更低 + * * @param nums * @return */ public int reversePairs3(int[] nums) { - if (nums == null || nums.length < 2) + if (nums == null || nums.length < 2) { return 0; + } int[] temp = new int[nums.length]; System.arraycopy(nums, 0, temp, 0, nums.length); @@ -118,10 +122,13 @@ private int mergeCount(int[] nums, int[] temp, int start, int end) { int count = 0; //merge() - int i = mid;//遍历左区域指针 - int j = end;//遍历右区域指针 + //遍历左区域指针 + int i = mid; + //遍历右区域指针 + int j = end; - int k = end;//临时区域指针 + //临时区域指针 + int k = end; while (i>= start && j>= mid + 1) { if (nums[i]> nums[j]) { count += j - mid; @@ -130,15 +137,37 @@ private int mergeCount(int[] nums, int[] temp, int start, int end) { temp[k--] = nums[j--]; } } + //如果还有剩下没遍历的 - while (i>= start) + while (i>= start) { temp[k--] = nums[i--]; - while (j>= mid + 1) + } + while (j>= mid + 1) { temp[k--] = nums[j--]; + } return count + left + right; } + public int reversePairs4(int[] nums) { + if (nums == null || nums.length < 2) { + return 0; + } + int[] temp = new int[nums.length]; + System.arraycopy(nums, 0, temp, 0, nums.length); + //int count = mergeCount2(); + return 0; + } + + private int mergeCount2(int[] nums, int[] temp, int start, int end) { + if (start>= end) { + return 0; + } + int mid = (start + end) << 1; + //int left = mergeCount2(nums, ); + return 0; + } + public static void main(String[] args) { ReversePairs reversePairs = new ReversePairs(); int[] nums = {7, 5, 6, 4}; diff --git a/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/SortColors.java b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/SortColors.java new file mode 100644 index 0000000..26fe731 --- /dev/null +++ b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/SortColors.java @@ -0,0 +1,56 @@ +package com.bruis.algorithminjava.algorithm.leetcode.array; + +/** + * + * 颜色分类 + * + * url:https://leetcode-cn.com/problems/sort-colors/ + * + * @author LuoHaiYang + */ +public class SortColors { + + public void sortColors(int[] nums) { + if (nums == null || nums.length < 2) { + return; + } + sort(nums, 0, nums.length - 1); + } + + private void sort(int[] nums, int left, int right) { + if (left>= right) { + return; + } + + int p = nums[left]; + int i = left + 1, lt = left, gt = right + 1; + + while (i < gt) { + if (nums[i] < p) { + swap(nums, i, lt + 1); + i++; + lt++; + } else if (nums[i]> p) { + swap(nums, i, gt - 1); + gt--; + } else { + i++; + } + } + swap(nums, left, lt); + sort(nums, left, lt - 1); + sort(nums, gt, right); + } + + private void swap(int[] nums, int i, int j) { + int tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + public static void main(String[] args) { + SortColors sortColors = new SortColors(); + int[] test = {0, 1}; + sortColors.sortColors(test); + } +} diff --git a/src/main/java/com/bruis/algorithminjava/algorithm/array/SubarraySumEqualsK.java b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/SubarraySumEqualsK.java similarity index 98% rename from src/main/java/com/bruis/algorithminjava/algorithm/array/SubarraySumEqualsK.java rename to src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/SubarraySumEqualsK.java index 82e703f..c7a7819 100644 --- a/src/main/java/com/bruis/algorithminjava/algorithm/array/SubarraySumEqualsK.java +++ b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/SubarraySumEqualsK.java @@ -1,4 +1,4 @@ -package com.bruis.algorithminjava.algorithm.array; +package com.bruis.algorithminjava.algorithm.leetcode.array; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/bruis/algorithminjava/algorithm/array/ThreeSum.java b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/ThreeSum.java similarity index 98% rename from src/main/java/com/bruis/algorithminjava/algorithm/array/ThreeSum.java rename to src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/ThreeSum.java index 65d6ea4..435fa3a 100644 --- a/src/main/java/com/bruis/algorithminjava/algorithm/array/ThreeSum.java +++ b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/ThreeSum.java @@ -1,4 +1,4 @@ -package com.bruis.algorithminjava.algorithm.array; +package com.bruis.algorithminjava.algorithm.leetcode.array; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/com/bruis/algorithminjava/algorithm/array/TwoSum.java b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/TwoSum.java similarity index 97% rename from src/main/java/com/bruis/algorithminjava/algorithm/array/TwoSum.java rename to src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/TwoSum.java index 6d8097e..08d7dcc 100644 --- a/src/main/java/com/bruis/algorithminjava/algorithm/array/TwoSum.java +++ b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/TwoSum.java @@ -1,4 +1,4 @@ -package com.bruis.algorithminjava.algorithm.array; +package com.bruis.algorithminjava.algorithm.leetcode.array; import java.util.HashMap; import java.util.Map; From 9620fb4bf96f86f88dfb39ccb4da3922057a3468 Mon Sep 17 00:00:00 2001 From: LuoHaiYang Date: 2020年8月18日 10:04:09 +0800 Subject: [PATCH 03/16] =?UTF-8?q?[D]=20=E5=88=A0=E9=99=A4note/leetcode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/leetcode/ReversePairs.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 notes/leetcode/ReversePairs.md diff --git a/notes/leetcode/ReversePairs.md b/notes/leetcode/ReversePairs.md deleted file mode 100644 index 7368349..0000000 --- a/notes/leetcode/ReversePairs.md +++ /dev/null @@ -1,3 +0,0 @@ -``` - -``` \ No newline at end of file From c65c26fc881b8f62e6154a755e86e5da12f1a6dc Mon Sep 17 00:00:00 2001 From: LuoHaiYang Date: 2020年8月18日 15:08:30 +0800 Subject: [PATCH 04/16] =?UTF-8?q?[A]=20=E6=B7=BB=E5=8A=A0leetcode=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=EF=BC=9AMaximumGap=EF=BC=9B[A]=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=A1=B6=E6=8E=92=E5=BA=8F=E7=AE=97=E6=B3=95=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../algorithm/leetcode/array/MaximumGap.java | 71 +++++++++++++++++++ .../algorithm/sort/BucketSort.java | 55 ++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/MaximumGap.java create mode 100644 src/main/java/com/bruis/algorithminjava/algorithm/sort/BucketSort.java diff --git a/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/MaximumGap.java b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/MaximumGap.java new file mode 100644 index 0000000..07014d3 --- /dev/null +++ b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/MaximumGap.java @@ -0,0 +1,71 @@ +package com.bruis.algorithminjava.algorithm.leetcode.array; + +/** + * 最大间距 + * + * url:https://leetcode-cn.com/problems/maximum-gap/ + * + * @author LuoHaiYang + */ +public class MaximumGap { + public int maximumGap(int[] nums) { + if (nums == null || nums.length < 2) { + return 0; + } + // 排序 + quickSort(nums); + int n = nums.length; + + int max = nums[1] - nums[0]; + + for (int i = 2; i < n; i++) { + max = max(max, nums[i] - nums[i-1]); + } + return max; + } + + private void quickSort(int[] nums) { + int n = nums.length; + quickSort3ways(nums, 0, n-1); + } + + private void quickSort3ways(int[] nums, int left, int right) { + if (left>= right) { + return; + } + int p = nums[left]; + int i = left + 1, lt = left, gt = right + 1; + + while (i < gt) { + if (nums[i] < p) { + swap(nums, i, lt + 1); + i++; + lt++; + } else if (nums[i]> p) { + swap(nums, i, gt - 1); + gt--; + } else { + i++; + } + } + swap(nums, left, lt); + quickSort3ways(nums, left, lt - 1); + quickSort3ways(nums, gt, right); + } + + private int max(int i, int j) { + return i> j ? i : j; + } + + private void swap(int[] nums, int i, int j) { + int tmp = nums[i]; + nums[i] = nums[j]; + nums[j] = tmp; + } + + public static void main(String[] args) { + int[] test = {3,6,9,1,20,15,11,30,31}; + MaximumGap maximumGap = new MaximumGap(); + System.out.println(maximumGap.maximumGap(test)); + } +} diff --git a/src/main/java/com/bruis/algorithminjava/algorithm/sort/BucketSort.java b/src/main/java/com/bruis/algorithminjava/algorithm/sort/BucketSort.java new file mode 100644 index 0000000..64db417 --- /dev/null +++ b/src/main/java/com/bruis/algorithminjava/algorithm/sort/BucketSort.java @@ -0,0 +1,55 @@ +package com.bruis.algorithminjava.algorithm.sort; + +import java.util.LinkedList; +import java.util.List; + +/** + * 桶排序 + * + * @author LuoHaiYang + */ +public class BucketSort { + /* 排序原理: + + 桶排序本质就是空间换时间:时间复杂度为:O(n) + + 顺序从待排数组中取出数字,首先6被取出,然后把6入6号桶,这个过程类似这样:空桶[ 待排数组[ 0 ] ] = 待排数组[ 0 ] + [6 2 4 1 5 9] 待排数组 + [0 0 0 0 0 0 6 0 0 0] 空桶 + [0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在) + 顺序从待排数组中取出下一个数字,此时2被取出,将其放入2号桶,是几就放几号桶 + [6 2 4 1 5 9] 待排数组 + [0 0 2 0 0 0 6 0 0 0] 空桶 + [0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在) + 3,4,5,6省略,过程一样,全部入桶后变成下边这样 + [6 2 4 1 5 9] 待排数组 + [0 1 2 0 4 5 6 0 0 9] 空桶 + [0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在) + */ + private int range = 0; + public BucketSort(int range) { + this.range = range; + } + public int[] doSort(int[] arr) { + // 集合数组 + List[] aux = new LinkedList[range]; + for (int i = 0; i < aux.length; i++) { + aux[i] = new LinkedList(); + } + for (int i = 0; i < arr.length; i++) { + aux[arr[i]].add(arr[i]); + } + for (int i = 0, j = 0; i < aux.length && j < arr.length; i++) { + for (int v : aux[i]) { + arr[j] = v; + j++; + } + } + return arr; + } + + public static void main(String[] args) { + BucketSort bucketSort = new BucketSort(10); + bucketSort.doSort(new int[]{4,1,3,2,6,9,9}); + } +} From cdae2b93438b8606cc9c5a9563838b5338dfad38 Mon Sep 17 00:00:00 2001 From: CoderBruis <37364336+coderbruis@users.noreply.github.com> Date: 2020年8月19日 14:48:57 +0800 Subject: [PATCH 05/16] =?UTF-8?q?[U]=20=E6=9B=B4=E6=96=B0=E5=8F=8C?= =?UTF-8?q?=E8=B7=AF=E5=BF=AB=E6=8E=92bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...200円237円346円216円222円345円272円217円347円256円227円346円263円225円.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/notes/algorithms/345円277円253円351円200円237円346円216円222円345円272円217円347円256円227円346円263円225円.md" "b/notes/algorithms/345円277円253円351円200円237円346円216円222円345円272円217円347円256円227円346円263円225円.md" index 2add10d..4e43714 100644 --- "a/notes/algorithms/345円277円253円351円200円237円346円216円222円345円272円217円347円256円227円346円263円225円.md" +++ "b/notes/algorithms/345円277円253円351円200円237円346円216円222円345円272円217円347円256円227円346円263円225円.md" @@ -193,7 +193,7 @@ public class QuickSort2Ways { while(i <= right && arr[i] < p) { i++; } - while(j>= 0 && arr[j]> p) { + while(j>= left + 1 && arr[j]> p) { j--; } From 59e091bec01d7d33266e8c3ad074e5effac43921 Mon Sep 17 00:00:00 2001 From: LuoHaiYang Date: 2020年8月21日 11:29:29 +0800 Subject: [PATCH 06/16] =?UTF-8?q?[A]=20=E6=B7=BB=E5=8A=A0TopK=E9=A2=98?= =?UTF-8?q?=E8=A7=A3=EF=BC=9B[U]=20=E6=9B=B4=E6=96=B0readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 54 ++++++++-------- .../leetcode/array/TopKFrequentElements.java | 61 +++++++++++++++++++ 2 files changed, 88 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/TopKFrequentElements.java diff --git a/README.md b/README.md index 43ecc07..4c4c1cb 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,15 @@ # 经典排序算法 -- [冒泡排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) -- [选择排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) -- [插入排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) -- [归并排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) -- [快速排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) -- [希尔排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) -- [桶排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E6%A1%B6%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) -- [基数排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) -- [堆排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%A0%86%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) +- [x] [冒泡排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) +- [x] [选择排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) +- [x] [插入排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) +- [x] [归并排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) +- [x] [快速排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) +- [x] [希尔排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) +- [x] [桶排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E6%A1%B6%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) +- [x] [基数排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) +- [x] [堆排序](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/algorithms/%E5%A0%86%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95.md) ## 排序算法总结 @@ -50,27 +50,27 @@ # 经典算法 -- KMP算法 -- 马拉车算法 -- Prim算法 -- Krusk算法 -- Dijkstra算法 -- Bellman-Ford算法 +- [ ] KMP算法 +- [ ] 马拉车算法 +- [ ] Prim算法 +- [ ] Krusk算法 +- [ ] Dijkstra算法 +- [ ] Bellman-Ford算法 # 经典数据结构 -- 数组 -- 栈和队列 -- 链表 -- 二分搜索树 -- 集合和映射 -- [堆和优先队列](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/datastructures/%E5%A0%86%E5%92%8C%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97.md) 【更新中】 -- 线段树 -- Trie树 -- 并查集 -- [AVL树](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/datastructures/AVL%E6%A0%91.md)【更新中】 -- 红黑树 -- 哈希表 +- [ ] 数组 +- [ ] 栈和队列 +- [ ] 链表 +- [ ] 二分搜索树 +- [ ] 集合和映射 +- [x] [堆和优先队列](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/datastructures/%E5%A0%86%E5%92%8C%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97.md) +- [ ] 线段树 +- [ ] Trie树 +- [ ] 并查集 +- [x] [AVL树](https://github.com/coderbruis/AlgorithmsInJava/blob/master/notes/datastructures/AVL%E6%A0%91.md) +- [ ] 红黑树 +- [ ] 哈希表 ==================== 持续更新 =================== diff --git a/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/TopKFrequentElements.java b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/TopKFrequentElements.java new file mode 100644 index 0000000..cc1c76d --- /dev/null +++ b/src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/TopKFrequentElements.java @@ -0,0 +1,61 @@ +package com.bruis.algorithminjava.algorithm.leetcode.array; + +import java.util.*; + +/** + * + * 前K个高频元素 + * + * url:https://leetcode-cn.com/problems/top-k-frequent-elements/ + * + * @author LuoHaiYang + */ +public class TopKFrequentElements { + + /** + * + * + * + */ + public int[] topKFrequent(int[] nums, int k) { + if (nums == null || nums.length < 2) { + return nums; + } + Map count = new LinkedHashMap(); + int n = nums.length; + + for (int i = 0; i < n; i++) { + if (count.containsKey(nums[i])) { + count.put(nums[i], count.get(nums[i]) + 1); + } else { + count.put(nums[i], 1); + } + } + + List result = new ArrayList(); + + Set