diff --git a/solution/0100-0199/0181.Employees Earning More Than Their Managers/README.md b/solution/0100-0199/0181.Employees Earning More Than Their Managers/README.md index 3b482f41a59b9..c865c90407964 100644 --- a/solution/0100-0199/0181.Employees Earning More Than Their Managers/README.md +++ b/solution/0100-0199/0181.Employees Earning More Than Their Managers/README.md @@ -44,7 +44,7 @@ id 是该表的主键(具有唯一值的列)。
示例 1:
-输入: +输入: Employee 表: +----+-------+--------+-----------+ | id | name | salary | managerId | @@ -54,7 +54,7 @@ Employee 表: | 3 | Sam | 60000 | Null | | 4 | Max | 90000 | Null | +----+-------+--------+-----------+ -输出: +输出: +----------+ | Employee | +----------+ @@ -68,7 +68,9 @@ Employee 表: -### 方法一 +### 方法一:自连接 + 条件筛选 + +我们可以通过自连接 `Employee` 表,找出员工的工资以及其经理的工资,然后筛选出工资比经理高的员工。 @@ -79,44 +81,22 @@ import pandas as pd def find_employees(employee: pd.DataFrame) -> pd.DataFrame: - df = employee.merge(right=employee, how="left", left_on="managerId", right_on="id") - emp = df[df["salary_x"] > df["salary_y"]]["name_x"] - - return pd.DataFrame({"Employee": emp}) -``` - -#### MySQL - -```sql -SELECT Name AS Employee -FROM Employee AS Curr -WHERE - Salary > ( - SELECT Salary - FROM Employee - WHERE Id = Curr.ManagerId - ); + merged = employee.merge( + employee, left_on="managerId", right_on="id", suffixes=("", "_manager") + ) + result = merged[merged["salary"] > merged["salary_manager"]][["name"]] + result.columns = ["Employee"] + return result ``` - - - - - - -### 方法二 - - - #### MySQL ```sql # Write your MySQL query statement below -SELECT - e1.name AS Employee +SELECT e1.name Employee FROM - Employee AS e1 - JOIN Employee AS e2 ON e1.managerId = e2.id + Employee e1 + JOIN Employee e2 ON e1.managerId = e2.id WHERE e1.salary > e2.salary; ``` diff --git a/solution/0100-0199/0181.Employees Earning More Than Their Managers/README_EN.md b/solution/0100-0199/0181.Employees Earning More Than Their Managers/README_EN.md index 60ad47ffbcc60..4c5b427dbfe48 100644 --- a/solution/0100-0199/0181.Employees Earning More Than Their Managers/README_EN.md +++ b/solution/0100-0199/0181.Employees Earning More Than Their Managers/README_EN.md @@ -43,7 +43,7 @@ Each row of this table indicates the ID of an employee, their name, salary, andExample 1:
-Input: +Input: Employee table: +----+-------+--------+-----------+ | id | name | salary | managerId | @@ -53,7 +53,7 @@ Employee table: | 3 | Sam | 60000 | Null | | 4 | Max | 90000 | Null | +----+-------+--------+-----------+ -Output: +Output: +----------+ | Employee | +----------+ @@ -68,7 +68,9 @@ Employee table: -### Solution 1 +### Solution 1: Self-Join + Conditional Filtering + +We can find employees' salaries and their managers' salaries by self-joining the `Employee` table, then filter out employees whose salaries are higher than their managers' salaries. @@ -79,44 +81,22 @@ import pandas as pd def find_employees(employee: pd.DataFrame) -> pd.DataFrame: - df = employee.merge(right=employee, how="left", left_on="managerId", right_on="id") - emp = df[df["salary_x"] > df["salary_y"]]["name_x"] - - return pd.DataFrame({"Employee": emp}) -``` - -#### MySQL - -```sql -SELECT Name AS Employee -FROM Employee AS Curr -WHERE - Salary > ( - SELECT Salary - FROM Employee - WHERE Id = Curr.ManagerId - ); + merged = employee.merge( + employee, left_on="managerId", right_on="id", suffixes=("", "_manager") + ) + result = merged[merged["salary"] > merged["salary_manager"]][["name"]] + result.columns = ["Employee"] + return result ``` - - - - - - -### Solution 2 - - - #### MySQL ```sql # Write your MySQL query statement below -SELECT - e1.name AS Employee +SELECT e1.name Employee FROM - Employee AS e1 - JOIN Employee AS e2 ON e1.managerId = e2.id + Employee e1 + JOIN Employee e2 ON e1.managerId = e2.id WHERE e1.salary > e2.salary; ``` diff --git a/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution.py b/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution.py index 2084f018ba6ad..e9d9b508f46b9 100644 --- a/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution.py +++ b/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution.py @@ -2,7 +2,9 @@ def find_employees(employee: pd.DataFrame) -> pd.DataFrame: - df = employee.merge(right=employee, how="left", left_on="managerId", right_on="id") - emp = df[df["salary_x"] > df["salary_y"]]["name_x"] - - return pd.DataFrame({"Employee": emp}) + merged = employee.merge( + employee, left_on="managerId", right_on="id", suffixes=("", "_manager") + ) + result = merged[merged["salary"] > merged["salary_manager"]][["name"]] + result.columns = ["Employee"] + return result diff --git a/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution.sql b/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution.sql index da349ae2189b6..09530491aef0c 100644 --- a/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution.sql +++ b/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution.sql @@ -1,8 +1,6 @@ -SELECT Name AS Employee -FROM Employee AS Curr -WHERE - Salary > ( - SELECT Salary - FROM Employee - WHERE Id = Curr.ManagerId - ); +# Write your MySQL query statement below +SELECT e1.name Employee +FROM + Employee e1 + JOIN Employee e2 ON e1.managerId = e2.id +WHERE e1.salary > e2.salary; diff --git a/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution2.sql b/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution2.sql deleted file mode 100644 index b285eab38d01a..0000000000000 --- a/solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution2.sql +++ /dev/null @@ -1,7 +0,0 @@ -# Write your MySQL query statement below -SELECT - e1.name AS Employee -FROM - Employee AS e1 - JOIN Employee AS e2 ON e1.managerId = e2.id -WHERE e1.salary > e2.salary; diff --git a/solution/0400-0499/0459.Repeated Substring Pattern/README.md b/solution/0400-0499/0459.Repeated Substring Pattern/README.md index cd3b2ad9c8bb8..3ed5096f5445e 100644 --- a/solution/0400-0499/0459.Repeated Substring Pattern/README.md +++ b/solution/0400-0499/0459.Repeated Substring Pattern/README.md @@ -131,39 +131,4 @@ impl Solution { - - -### 方法二 - - - -#### TypeScript - -```ts -function repeatedSubstringPattern(s: string): boolean { - const n = s.length; - for (let i = 0; i < n >> 1; i++) { - const len = i + 1; - if (n % len !== 0) { - continue; - } - const t = s.slice(0, len); - let j: number; - for (j = len; j < n; j += len) { - if (s.slice(j, j + len) !== t) { - break; - } - } - if (j === n) { - return true; - } - } - return false; -} -``` - - - - - diff --git a/solution/0400-0499/0459.Repeated Substring Pattern/README_EN.md b/solution/0400-0499/0459.Repeated Substring Pattern/README_EN.md index 796b58a2b53c5..f537437ecaf1f 100644 --- a/solution/0400-0499/0459.Repeated Substring Pattern/README_EN.md +++ b/solution/0400-0499/0459.Repeated Substring Pattern/README_EN.md @@ -121,39 +121,4 @@ impl Solution { - - -### Solution 2 - - - -#### TypeScript - -```ts -function repeatedSubstringPattern(s: string): boolean { - const n = s.length; - for (let i = 0; i < n >> 1; i++) { - const len = i + 1; - if (n % len !== 0) { - continue; - } - const t = s.slice(0, len); - let j: number; - for (j = len; j < n; j += len) { - if (s.slice(j, j + len) !== t) { - break; - } - } - if (j === n) { - return true; - } - } - return false; -} -``` - - - - - diff --git a/solution/0400-0499/0459.Repeated Substring Pattern/Solution2.ts b/solution/0400-0499/0459.Repeated Substring Pattern/Solution2.ts deleted file mode 100644 index 04bb2475a988e..0000000000000 --- a/solution/0400-0499/0459.Repeated Substring Pattern/Solution2.ts +++ /dev/null @@ -1,20 +0,0 @@ -function repeatedSubstringPattern(s: string): boolean { - const n = s.length; - for (let i = 0; i < n >> 1; i++) { - const len = i + 1; - if (n % len !== 0) { - continue; - } - const t = s.slice(0, len); - let j: number; - for (j = len; j < n; j += len) { - if (s.slice(j, j + len) !== t) { - break; - } - } - if (j === n) { - return true; - } - } - return false; -} diff --git a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/README.md b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/README.md index 9766fcc59c830..ecaba2c407888 100644 --- a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/README.md +++ b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/README.md @@ -115,7 +115,9 @@ public: sort(nums.begin(), nums.end()); int k = nums[nums.size() >> 1]; int ans = 0; - for (int& v : nums) ans += abs(v - k); + for (int& v : nums) { + ans += abs(v - k); + } return ans; } }; @@ -147,8 +149,8 @@ func abs(x int) int { ```ts function minMoves2(nums: number[]): number { nums.sort((a, b) => a - b); - const mid = nums[nums.length >> 1]; - return nums.reduce((r, v) => r + Math.abs(v - mid), 0); + const k = nums[nums.length >> 1]; + return nums.reduce((r, v) => r + Math.abs(v - k), 0); } ``` @@ -158,12 +160,12 @@ function minMoves2(nums: number[]): number { impl Solution { pub fn min_moves2(mut nums: Vec) -> i32 { nums.sort(); - let mid = nums[nums.len() / 2]; - let mut res = 0; + let k = nums[nums.len() / 2]; + let mut ans = 0; for num in nums.iter() { - res += (num - mid).abs(); + ans += (num - k).abs(); } - res + ans } } ``` @@ -172,35 +174,4 @@ impl Solution { - - -### 方法二:排序 + 前缀和 - -如果我们不知道中位数的性质,也可以使用前缀和的方法来求解。 - -时间复杂度 $O(n\log n)$,空间复杂度 $O(n)$。 - - - -#### Python3 - -```python -class Solution: - def minMoves2(self, nums: List[int]) -> int: - def move(i): - v = nums[i] - a = v * i - s[i] - b = s[-1] - s[i + 1] - v * (n - i - 1) - return a + b - - nums.sort() - s = [0] + list(accumulate(nums)) - n = len(nums) - return min(move(i) for i in range(n)) -``` - - - - - diff --git a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/README_EN.md b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/README_EN.md index 30f763d29f493..86c2ff43fc2b4 100644 --- a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/README_EN.md +++ b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/README_EN.md @@ -57,7 +57,24 @@ Only two moves are needed (remember each move increments or decrements one eleme -### Solution 1 +### Solution 1: Sorting + Median + +This problem can be abstracted to finding a point on a number line such that the sum of distances from $n$ points to this point is minimized. The answer is the median of the $n$ points. + +The median has the property that the sum of distances from all numbers to the median is minimized. + +Proof: + +First, given a sorted sequence $a_1, a_2, \cdots, a_n$, we assume $x$ is the point that minimizes the sum of distances from $a_1$ to $a_n$. Clearly, $x$ must lie between $a_1$ and $a_n$. Since the distances from $a_1$ and $a_n$ to $x$ are equal and both equal to $a_n - a_1$, we can ignore $a_1$ and $a_n$ and only consider $a_2, a_3, \cdots, a_{n-1}$. This reduces the problem to finding a point within $a_2, a_3, \cdots, a_{n-1}$ that minimizes the sum of distances. By iterating this process, we conclude that the median of a sequence minimizes the sum of distances to the other numbers. + +In this problem, we can first sort the array, then find the median, and finally calculate the sum of distances from all numbers to the median. + +The time complexity is $O(n \log n)$, and the space complexity is $O(\log n)$. + +Similar problems: + +- [296. Best Meeting Point](https://github.com/doocs/leetcode/blob/main/solution/0200-0299/0296.Best%20Meeting%20Point/README_EN.md) +- [2448. Minimum Cost to Make Array Equal](https://github.com/doocs/leetcode/blob/main/solution/2400-2499/2448.Minimum%20Cost%20to%20Make%20Array%20Equal/README_EN.md) @@ -96,7 +113,9 @@ public: sort(nums.begin(), nums.end()); int k = nums[nums.size() >> 1]; int ans = 0; - for (int& v : nums) ans += abs(v - k); + for (int& v : nums) { + ans += abs(v - k); + } return ans; } }; @@ -128,8 +147,8 @@ func abs(x int) int { ```ts function minMoves2(nums: number[]): number { nums.sort((a, b) => a - b); - const mid = nums[nums.length >> 1]; - return nums.reduce((r, v) => r + Math.abs(v - mid), 0); + const k = nums[nums.length >> 1]; + return nums.reduce((r, v) => r + Math.abs(v - k), 0); } ``` @@ -139,12 +158,12 @@ function minMoves2(nums: number[]): number { impl Solution { pub fn min_moves2(mut nums: Vec ) -> i32 { nums.sort(); - let mid = nums[nums.len() / 2]; - let mut res = 0; + let k = nums[nums.len() / 2]; + let mut ans = 0; for num in nums.iter() { - res += (num - mid).abs(); + ans += (num - k).abs(); } - res + ans } } ``` @@ -153,31 +172,4 @@ impl Solution { - - -### Solution 2 - - - -#### Python3 - -```python -class Solution: - def minMoves2(self, nums: List[int]) -> int: - def move(i): - v = nums[i] - a = v * i - s[i] - b = s[-1] - s[i + 1] - v * (n - i - 1) - return a + b - - nums.sort() - s = [0] + list(accumulate(nums)) - n = len(nums) - return min(move(i) for i in range(n)) -``` - - - - - diff --git a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.cpp b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.cpp index b51d3aa425ee1..3ea2196946003 100644 --- a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.cpp +++ b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.cpp @@ -4,7 +4,9 @@ class Solution { sort(nums.begin(), nums.end()); int k = nums[nums.size() >> 1]; int ans = 0; - for (int& v : nums) ans += abs(v - k); + for (int& v : nums) { + ans += abs(v - k); + } return ans; } -}; \ No newline at end of file +}; diff --git a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.rs b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.rs index e561b2e2e178b..82b2a43d13e1c 100644 --- a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.rs +++ b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.rs @@ -1,11 +1,11 @@ impl Solution { pub fn min_moves2(mut nums: Vec ) -> i32 { nums.sort(); - let mid = nums[nums.len() / 2]; - let mut res = 0; + let k = nums[nums.len() / 2]; + let mut ans = 0; for num in nums.iter() { - res += (num - mid).abs(); + ans += (num - k).abs(); } - res + ans } } diff --git a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.ts b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.ts index f01325954ee85..b209cf697dd2d 100644 --- a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.ts +++ b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution.ts @@ -1,5 +1,5 @@ function minMoves2(nums: number[]): number { nums.sort((a, b) => a - b); - const mid = nums[nums.length >> 1]; - return nums.reduce((r, v) => r + Math.abs(v - mid), 0); + const k = nums[nums.length >> 1]; + return nums.reduce((r, v) => r + Math.abs(v - k), 0); } diff --git a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution2.py b/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution2.py deleted file mode 100644 index f099225ea8553..0000000000000 --- a/solution/0400-0499/0462.Minimum Moves to Equal Array Elements II/Solution2.py +++ /dev/null @@ -1,12 +0,0 @@ -class Solution: - def minMoves2(self, nums: List[int]) -> int: - def move(i): - v = nums[i] - a = v * i - s[i] - b = s[-1] - s[i + 1] - v * (n - i - 1) - return a + b - - nums.sort() - s = [0] + list(accumulate(nums)) - n = len(nums) - return min(move(i) for i in range(n))