From 2b6a2d6533d8bcfa62889e5b10ffc457404b67a5 Mon Sep 17 00:00:00 2001 From: wisdompeak Date: Sun, 23 Oct 2022 23:14:40 -0700 Subject: [PATCH 1/5] Create Readme.md --- Math/2448.Minimum-Cost-to-Make-Array-Equal/Readme.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 Math/2448.Minimum-Cost-to-Make-Array-Equal/Readme.md diff --git a/Math/2448.Minimum-Cost-to-Make-Array-Equal/Readme.md b/Math/2448.Minimum-Cost-to-Make-Array-Equal/Readme.md new file mode 100644 index 000000000..47697f225 --- /dev/null +++ b/Math/2448.Minimum-Cost-to-Make-Array-Equal/Readme.md @@ -0,0 +1,12 @@ +### 2448.Minimum-Cost-to-Make-Array-Equal + +#### 解法1: +如果本题的所有cost[i]都是1的话,我们发现这其实就是`296.Best-Meeting-Point`。我们应该对这个结论很熟悉:对于一维序列{xi},我们想找一个位置p使得`sum{abs(xi-p)}`最小化,那么p的位置一定就是{xi}的中位数。 + +对于本题而言,我们想找一个位置p使得`sum{abs(xi-p)*cost[i]}`最小化。这其实可以卡成将每个xi复制cost[i]份,从而得到一个长度为totalCost的序列,然后回归到上述的问题。显然,我们想要找的位置就是新序列的中位数。我们只需要每查看一个xi,就增加`count+=cost[i]`,直至发现count恰好超过了totalCost的一半时候为止,这个xi就是best equal value. + + +#### 解法2: +对于这类题目,我们通常会有一个大胆的猜测,最优解所对应的“best equal value”一定是nums里的某一个元素。为什么呢?假设这个best equal value是x,位于排序后的某两个元素之间(记做nums[i]和nums[j]),那么我们可以论证还会有比x更优的解。假如我们将equal value设为x+1,那么对于右边的元素,总共会减少costSum[j:n-1],对于左边的元素,总共会增加costSum[0:i],即`delta1 = costSum[0:i]-costSum[j:n-1]`. 假如我们将equal value设为x-1,类似的会有`delta2 = -costSum[0:i]+costSum[j:n-1]`。通常情况下delta1和delta2必然是一正一负,这就意味着必然有一个方向能够得到更优的策略(即x+1或者x-1)。这个方向的移动可以持续,直至best equal value设置在了nums[i]或者nums[j]上。 + +有了这个想法,我们只需要遍历一遍每个nums[i],假想它是equal value的话,cost是多少。cost包括了左边元素的提升costLeft,以及右边元素的下降costRight。我们从左往右遍历的时候,costLeft都是可以一路累加的,即`costLeft[i] = costLeft[i-1]+costSum[i:i-1]*(nums[i]-nums[i-1])`. 同理我们从右往左走一遍,求得所有的costRight[i]。最终我们挑选最小的`costLeft[i]+costRight[i]`. From 5c8c3372fa2e99a96f9d6d3309b0fb6a14b1bf61 Mon Sep 17 00:00:00 2001 From: wisdompeak Date: Mon, 24 Oct 2022 00:13:25 -0700 Subject: [PATCH 2/5] Update 204.Count Primes.cpp --- Math/204.Count-Primes/204.Count Primes.cpp | 24 ++++++++-------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/Math/204.Count-Primes/204.Count Primes.cpp b/Math/204.Count-Primes/204.Count Primes.cpp index 12e036640..45539ed0e 100644 --- a/Math/204.Count-Primes/204.Count Primes.cpp +++ b/Math/204.Count-Primes/204.Count Primes.cpp @@ -1,25 +1,17 @@ class Solution { public: int countPrimes(int n) - { - if (n<=2) return 0; + { + vector isPrime(n, 1); + int count = 0; - vector num(n - 1, true); - - for (int x = 2; x <= sqrt(n); x++) + for (int i = 2; i < n; i++) { - if (num[x]==false) continue; - - for (int j=2; x*j < n; j++) - num[x*j] = false; + if (isPrime[i]==false) continue; + count++; + for (int j=2*i; j < n; j+=i) + isPrime[j] = false; } - - int count=0; - for (int j = 2; j < n; ++j) - { - if (num[j]) count++; - } - return count; } }; From 1a669c500d79a66fa82bb62d99d5f48f5acf87a2 Mon Sep 17 00:00:00 2001 From: wisdompeak Date: Mon, 24 Oct 2022 00:30:14 -0700 Subject: [PATCH 3/5] Update Readme.md --- Math/204.Count-Primes/Readme.md | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/Math/204.Count-Primes/Readme.md b/Math/204.Count-Primes/Readme.md index 0c048af5a..391011121 100644 --- a/Math/204.Count-Primes/Readme.md +++ b/Math/204.Count-Primes/Readme.md @@ -1,18 +1,6 @@ ### 204.Count-Primes -用倍数筛除法去除所有已知质数的倍数。 -```cpp -vectorq(n,true); -for (x=2; x<=sqrt(n); x++) -{ - if (q[x]==false) continue; - for (int i=2; x*i Date: Mon, 24 Oct 2022 00:31:59 -0700 Subject: [PATCH 4/5] Rename 204.Count Primes.cpp to 204.Count-Primes.cpp --- .../{204.Count Primes.cpp => 204.Count-Primes.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Math/204.Count-Primes/{204.Count Primes.cpp => 204.Count-Primes.cpp} (100%) diff --git a/Math/204.Count-Primes/204.Count Primes.cpp b/Math/204.Count-Primes/204.Count-Primes.cpp similarity index 100% rename from Math/204.Count-Primes/204.Count Primes.cpp rename to Math/204.Count-Primes/204.Count-Primes.cpp From 6789f2d1d9ff111c38061619437e08b1f4a9535b Mon Sep 17 00:00:00 2001 From: wisdompeak Date: Mon, 24 Oct 2022 00:47:11 -0700 Subject: [PATCH 5/5] Update 204.Count-Primes.cpp --- Math/204.Count-Primes/204.Count-Primes.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Math/204.Count-Primes/204.Count-Primes.cpp b/Math/204.Count-Primes/204.Count-Primes.cpp index 45539ed0e..6c7f07dde 100644 --- a/Math/204.Count-Primes/204.Count-Primes.cpp +++ b/Math/204.Count-Primes/204.Count-Primes.cpp @@ -1,17 +1,19 @@ class Solution { public: int countPrimes(int n) - { - vector isPrime(n, 1); + { + vectorisPrime(n, true); int count = 0; - - for (int i = 2; i < n; i++) + for (int i=2; i