From 80317a821407a54701e8439f874b15bbcb7cb3a8 Mon Sep 17 00:00:00 2001 From: fanxb Date: Fri, 31 Dec 2021 16:57:50 +0800 Subject: [PATCH] add --- 5.leetcode/src/com/fanxb/common/Q40.java | 38 +++++++++++++++++++++ 5.leetcode/src/com/fanxb/common/Q507.java | 18 ++++++++++ 5.leetcode/src/com/fanxb/common/Q825.java | 41 +++++++++++------------ 3 files changed, 75 insertions(+), 22 deletions(-) create mode 100644 5.leetcode/src/com/fanxb/common/Q40.java create mode 100644 5.leetcode/src/com/fanxb/common/Q507.java diff --git a/5.leetcode/src/com/fanxb/common/Q40.java b/5.leetcode/src/com/fanxb/common/Q40.java new file mode 100644 index 0000000..d0ff0e3 --- /dev/null +++ b/5.leetcode/src/com/fanxb/common/Q40.java @@ -0,0 +1,38 @@ +package com.fanxb.common; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +public class Q40 { + public List> combinationSum2(int[] candidates, int target) { + List> res = new LinkedList<>(); + Arrays.sort(candidates); + this.deal(res, new LinkedList<>(), 0, candidates, target); + return res; + } + + private void deal(List> res, List cur, int i, int[] sources, int target) { + if (target < sources[i]) { + return; + } + for (; i < sources.length; i++) { + if (sources[i] > target) { + return; + } + List temp = new LinkedList<>(cur); + temp.add(sources[i]); + if (sources[i] == target) { + res.add(temp); + } else { + deal(res, temp, i + 1, sources, target - sources[i]); + } + } + } + + public static void main(String[] args) { + new Q40().combinationSum2(new int[]{10, 1, 2, 7, 6, 1, 5}, 8); + } + + +} diff --git a/5.leetcode/src/com/fanxb/common/Q507.java b/5.leetcode/src/com/fanxb/common/Q507.java new file mode 100644 index 0000000..7297eb1 --- /dev/null +++ b/5.leetcode/src/com/fanxb/common/Q507.java @@ -0,0 +1,18 @@ +package com.fanxb.common; + +public class Q507 { + + public boolean checkPerfectNumber(int num) { + if (num == 1) { + return false; + } + int sum = 1; + double sqrt = Math.floor(Math.sqrt(num)); + for (int i = 2; i <= sqrt; i++) { + if (num % i == 0) { + sum += i + num / i; + } + } + return sum == num; + } +} diff --git a/5.leetcode/src/com/fanxb/common/Q825.java b/5.leetcode/src/com/fanxb/common/Q825.java index 85aa673..64e6e12 100644 --- a/5.leetcode/src/com/fanxb/common/Q825.java +++ b/5.leetcode/src/com/fanxb/common/Q825.java @@ -1,36 +1,33 @@ package com.fanxb.common; +import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Date; public class Q825 { public int numFriendRequests(int[] ages) { - int res = 0; - Arrays.sort(ages); - //二分查找100的分界点 - int index100 = search(ages, 100, 0, ages.length - 1); - for (int i = search(ages, 15, 0, index100); i <= index100; i++) { - int startIndex = search(ages, Double.valueOf(Math.ceil(0.5 * ages[i] + 7)).intValue(), 0, i); - res += i - startIndex; + //年龄计数 + int[] ageCount = new int[121]; + for (int age : ages) { + ageCount[age]++; } - for (int i = index100; i < ages.length; i++) { - int startIndex = search(ages, Double.valueOf(Math.ceil(0.5 * ages[i] + 7)).intValue(), index100, i); - res += i - startIndex; + //计算前缀和 + int[] preCount = new int[ageCount.length]; + for (int i = 1; i < ageCount.length; i++) { + preCount[i] = preCount[i - 1] + ageCount[i]; + } + int res = 0; + //从15岁开始遍历 + for (int i = 15; i < ageCount.length; i++) { + if (ageCount[i] == 0) { + continue; + } + int startAge = i / 2 + 7; + res += ageCount[i] * (preCount[i] - preCount[startAge] - 1); } return res; } - public int search(int[] ages, int target, int initL, int initR) { - int l = initL, r = initR, mid = (l + r) / 2; - while (l < r) { - if (ages[mid] < target) { - l = mid + 1; - } else { - r = mid; - } - mid = (l + r) / 2; - } - return l; - } public static void main(String[] args) { System.out.println(new Q825().numFriendRequests(new int[]{16, 16}));