解法均来自网络:
496.下一个更大元素1
给定两个没有重复元素的数组 nums1
和 nums2
,其中nums1
是 nums2
的子集。找到 nums1
中每个元素在 nums2
中的下一个比其大的值。
nums1
中数字 x 的下一个更大元素是指 x 在 nums2
中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出: [-1,3,-1] 解释: 对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。 对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。 对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
示例 2:
输入: nums1 = [2,4], nums2 = [1,2,3,4]. 输出: [3,-1] 解释: 对于num1中的数字2,第二个数组中的下一个较大数字是3。 对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。
注意:
nums1
和nums2
中所有元素是唯一的。nums1
和nums2
的数组大小都不超过1000。
解法:
维持一个非递增数组,存储在栈中,当下一个元素比栈顶大时,依次出栈,直到栈顶大于等于该元素时,停止出栈,该元素入栈,此时所有出栈的元素的下一个更大元素为该元素,存储在hashmap中,时间复杂度为O(n)
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
stack<int> s;
unordered_map<int, int> m;
for (int n : nums) {
while (s.size() && s.top() < n) {
m[s.top()] = n;
s.pop();
}
s.push(n);
}
vector<int> ans;
for (int n : findNums) ans.push_back(m.count(n) ? m[n] : -1);
return ans;
}
};
16.最接近的三数之和
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解法:先排序。设个diff
为三数之和sum
与target
的绝对差,从表头开始,对剩下的做两数之和,当diff
比预设的mindiff
小时,替换mindiff
。如果sum>target
则right
左移,反之右移(因为已经排好序)。
class Solution:
def threeSumClosest(self, nums, target):
""" :type nums: List[int] :rtype: List[List[int]] """
mindiff = 10000
nums.sort()
res = 0
for i in range(len(nums)):
left = i+1
right = len(nums)-1
while left < right:
sum = nums[left] + nums[right] + nums[i]
diff = abs(target - sum)
if diff < mindiff:
mindiff = diff
res = sum
if target == sum:
return sum
elif sum < target:
left += 1
else:
right -= 1
return res
204.计数质数
计算所有小于非负数整数 n 的质数数量。
个人解法:n^2,未能通过
class Solution: def countPrimes(self, n): """ :type n: int :rtype: int """ if n<=2: return 0 primes=[2] i=3 while i <n: check=0 for j in primes: if i%j==0: check=1 break if j*2 > i: break if check==0 : primes.append(i) i=i+2 return len(primes)
更好的方法:埃拉托斯特尼筛法Sieve of Eratosthenes
class Solution:
def countPrimes(self, n):
isPrime = [True] * max(n, 2)
isPrime[0], isPrime[1] = False, False
x = 2
while x * x < n:
if isPrime[x]:
p = x * x
while p < n:
isPrime[p] = False
p += x
x += 1
return sum(isPrime)