leetcode未做出题小结1

解法均来自网络:

496.下一个更大元素1

给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 大的元素。如果不存在,对应位置输出-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。

注意:

  1. nums1nums2中所有元素是唯一的。
  2. nums1nums2 的数组大小都不超过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为三数之和sumtarget的绝对差,从表头开始,对剩下的做两数之和,当diff比预设的mindiff小时,替换mindiff。如果sum>targetright左移,反之右移(因为已经排好序)。

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^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) 

点赞