leetcode27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解法一:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
left = 0
right = len(nums) - 1
while left <= right:
if nums[left] != val:
left += 1
else:
nums[left] = nums[right]
right -= 1
return left
思路:维护左右指针,分别从原数组左右开始遍历,若左指针所指到的值不为val,左指针往右,若左指针所指到的值为val,将右指针指到的值赋左指针,右指针往左。至多只需要遍历该数组一遍。
解法二:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
left = 0
for i, num in enumerate(nums):
if num == val:
continue
else:
nums[left] = num
left += 1
return left
思路:两个指针均为从左至右。若快指针指到的值为val,continue。若快指针指到的值不为val,将慢指针指到的值变为快指针的值,且慢指针右移。至多需要遍历该数组两遍。
leetcode577. 员工奖金
表:Employee
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| empId | int |
| name | varchar |
| supervisor | int |
| salary | int |
+-------------+---------+
empId 是该表中具有唯一值的列。
该表的每一行都表示员工的姓名和 id,以及他们的工资和经理的 id。
表:Bonus
+-------------+------+
| Column Name | Type |
+-------------+------+
| empId | int |
| bonus | int |
+-------------+------+
empId 是该表具有唯一值的列。
empId 是 Employee 表中 empId 的外键(reference 列)。
该表的每一行都包含一个员工的 id 和他们各自的奖金。
编写解决方案,报告每个奖金 少于 1000 的员工的姓名和奖金数额。
以 任意顺序 返回结果表。
题解:
SELECT E.name, B.bonus
FROM Employee AS E lEFT JOIN Bonus AS B
ON B.empId = E.empId
WHERE B.bonus < 1000 or B.bonus is null;
思路:使用 bonus is null(而不是 bonus = null)判断奖金是否为 null,太久没写sql忘了。。。
leetcode1913. 两个数对之间的最大乘积差
两个数对 (a, b) 和 (c, d) 之间的 乘积差 定义为 (a * b) - (c * d) 。
- 例如,
(5, 6)和(2, 7)之间的乘积差是(5 * 6) - (2 * 7) = 16。
给你一个整数数组 nums ,选出四个 不同的 下标 w、x、y 和 z ,使数对 (nums[w], nums[x]) 和 (nums[y], nums[z]) 之间的 乘积差 取到 最大值 。
返回以这种方式取得的乘积差中的 最大值 。
题解:
class Solution:
def maxProductDifference(self, nums: List[int]) -> int:
max1, max2 = max(nums[0], nums[1]), min(nums[0], nums[1]) //前两个数中最大的两个数
min1, min2 = min(nums[0], nums[1]), max(nums[0], nums[1]) //前两个数中最小的两个数
for i in range(2,len(nums)):
tmp = nums[i]
if tmp > max1://当前数若比最大数大,对其进行更新
max1, max2 = tmp, max1
elif tmp > max2://当前数比第二大数大,比最大数小,对其进行更新
max2 = tmp
if tmp < min1://当前数比最小数小,对其进行更新
min1, min2 = tmp, min1
elif tmp < min2://当前数比最小数大,比第二小数小,对其进行更新
min2 = tmp
return (max1 * max2) - (min1 * min2)
思路:即找出该数组中的最大的两个数和最小的两个数,