zoukankan      html  css  js  c++  java
  • 122.买卖股票的最佳时机、 125. 验证回文串、162. 寻找峰值

    122. 买卖股票的最佳时机 II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    示例 1:

    输入: [7,1,5,3,6,4]
    输出: 7
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
      随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
    示例 2:

    输入: [1,2,3,4,5]
    输出: 4
    解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
      注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
      因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
    示例 3:

    输入: [7,6,4,3,1]
    输出: 0
    解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
    在真实的面试中遇到过这道题?

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii

    class Solution:
    def maxProfit(self,prices):
    if len(prices) <= 1:
    return 0
    total = 0
    for i in range (1, len(prices)):
    if prices[i] > prices[i-1]:
    total += prices[i] - prices[i-1]
    return total


    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    125. 验证回文串

    给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

    说明:本题中,我们将空字符串定义为有效的回文串。

    示例 1:

    输入: "A man, a plan, a canal: Panama"
    输出: true
    示例 2:

    输入: "race a car"
    输出: false

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/valid-palindrome
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    class Solution:
    def isPalindrome(self, s):
    i, j = 0, (len(s)-1)
    while i < j:
    while i < j and not s[i].isalnum():
    i += 1
    while i < j and not s[j].isalnum():
    j -= 1
    if s[i].lower() != s[j].lower():
    return False
    i += 1
    j -= 1
    return True

    162. 寻找峰值

    峰值元素是指其值大于左右相邻值的元素。

    给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

    数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

    你可以假设 nums[-1] = nums[n] = -∞。

    示例 1:

    输入: nums = [1,2,3,1]
    输出: 2
    解释: 3 是峰值元素,你的函数应该返回其索引 2。
    示例 2:

    输入: nums = [1,2,1,3,5,6,4]
    输出: 1 或 5
    解释: 你的函数可以返回索引 1,其峰值元素为 2;
      或者返回索引 5, 其峰值元素为 6。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/find-peak-element
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    注:(为什么二分查找大的那一半一定会有峰值呢?(即nums[mid]<nums[mid+1]时,mid+1~N一定存在峰值) 我的理解是,首先已知 nums[mid+1]>nums[mid],那么mid+2只有两种可能,一个是大于mid+1,一个是小于mid+1,小于mid+1的情况,那么mid+1就是峰值,大于mid+1的情况,继续向右推,如果一直到数组的末尾都是大于的,那么可以肯定最后一个元素是峰值,因为nums[nums.length]=负无穷)

    class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
    # 方法一
    # size = len(nums)
    # for i in range(1, size-1):
    # if nums[i] > nums[i-1] and nums[i] > nums[i+1]:
    # return i
    # return [0, size - 1][nums[0] < nums[size-1]]
    # 方法二
    left, right = 0, len(nums) - 1

    while left < right:
    mid = (right + left) // 2
    if nums[mid] < nums[mid + 1]:
    left = mid + 1
    else:
    right = mid
    return left
  • 相关阅读:
    从淘宝数据结构来看电子商务中商品属性设计
    YY淘宝商品数据库设计
    ElasticSearch-聚合bucket学习
    ElasticSearch-聚合bucket
    Elasticsearch(9) --- 聚合查询(Bucket聚合)
    Elasticsearch-多字段搜索(Multifield Search)和提高精确度
    五、设备管理与文件系统
    六、YUM仓库
    四、查找命令
    二、用户权限
  • 原文地址:https://www.cnblogs.com/xqy-yz/p/11440898.html
Copyright © 2011-2022 走看看