python基础语法及数据机构联系--day02

三角形的最大周长

题目链接:976. 三角形的最大周长

image-20220419103312743

看到这个题的初始想法应该就是三重遍历遍历所有的组合情况,然后找到符合条件的最大周长,但是这种看看数据范围就知道肯定会超时

所以使用的方法是:排序+贪心

首先对数组进行排序(排序),然后从后向前遍历(贪心)

贪心是怎么贪的呐?你要找最大周长,那我就找每条边都可以取到最大的边,如果他们可以组成三角形,那么他组成的三角形一定是最大的

# -*- coding:utf-8
"""
作者: Jia
日期: 2022年04月19日
描述: https://leetcode-cn.com/problems/largest-perimeter-triangle/
"""
from typing import List


class Solution:
    def largestPerimeter(self, nums: List[int]) -> int:
        nums.sort()
        for i in range(len(nums) - 1, 1, -1):
            if nums[i] < nums[i - 1] + nums[i - 2]:
                return nums[i] + nums[i - 1] + nums[i - 2]
        return 0

找到最近的有相同X或Y坐标的点

题目链接:1779. 找到最近的有相同 X 或 Y 坐标的点

image-20220419103714309

这个题本来也想排序后贪心一下的,但是排序的话要同时考虑x和y,不太好弄,还是直接全部遍历了,而且也只用遍历一遍O(n),速度也不差

所以就只用全部遍历一遍,然后维护一个最小值以及最小值的下标即可,如果找到有效的距离比当前最小距离小就同时更新最小值和最小值的下标

# -*- coding:utf-8
"""
作者: Jia
日期: 2022年04月19日
描述: https://leetcode-cn.com/problems/find-nearest-point-that-has-the-same-x-or-y-coordinate/
"""
from typing import List


class Solution:
    def nearestValidPoint(self, x: int, y: int, points: List[List[int]]) -> int:
        idx = -1
        min_distance = float('inf')
        for i, (X, Y) in enumerate(points):
            if X == x or Y == y:
                distance = abs(X - x) + abs(Y - y)
                if distance < min_distance:
                    min_distance = distance
                    idx = i
        return idx

两个数组的交集II

题目链接:350. 两个数组的交集 II

image-20220419104148837

这个题有两种做法,下面的代码用的是第一种:

  • 字典:使用字典统计一个数组中各个数出现的次数,然后再去遍历另一个数组,如果在第一个数组中出现过并且次数比当前出现的次数多时就插入返回数组中
  • 排序+双指针:对两个数组都排序,然后创建指向两个数组头部的指针,判读当前指向的元素是否一致,直到遍历完一个数组
    • 如果是一致的,则把这个元素插入返回数组中
    • 如果不一致,则把指向较小元素的指针向后移动一位
# -*- coding:utf-8
"""
作者: Jia
日期: 2022年04月19日
描述: https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/
"""
from typing import List


class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        d = dict()
        # 统计nums1中的数据出现的次数
        for num in nums1:
            d[num] = d.get(num, 0) + 1

        ret = []
        # 统计nums2中数据出现的次数,如果在nums1中出现过就插入数组中
        for num in nums2:
            d[num] = d.get(num, 0) - 1
            if d[num] >= 0:
                ret.append(num)

        return ret

买卖股票的最佳时机

题目链接:121. 买卖股票的最佳时机

image-20220419112102557

这个题目也两种方法:

  • 第一种是直接暴力循环,二重循环把所有的情况都遍历一遍即可
  • 第二种是维护一个前面天数的最低价格,然后当天的最大利润就是当天价格减去前面的最低价格,如果这个差值比最大利润大就修改最大利润
# -*- coding:utf-8
"""
作者: Jia
日期: 2022年04月19日
描述: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
"""
from typing import List


class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        min_price = int(1e9)
        max_profit = 0
        for price in prices:
            if price < min_price:
                min_price = price
            elif price - min_price > max_profit:
                max_profit = price - min_price
        return max_profit

猜你喜欢

转载自blog.csdn.net/qq_46311811/article/details/124269369
今日推荐