码不停题:LeetCode 75-Day5

121. 买卖股票的最佳时机

❓题目描述

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

👉题目示例

示例 1:

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

💡题目解析与实现

很明显,这是需要找出数组中两个元素之间最大的和,且下标大的值要比下标小的值大

思路1:暴力破解

依次遍历数组中的元素

📝代码实现
class Solution {
    public int maxProfit(int[] prices) {
        int index = 0;
        // i < prices.length - 1 是为了保证j不越界
        for(int i = 0; i < prices.length - 1; i++){
            for(int j = i + 1; j < prices.length; j++){
                int temp = prices[j] - prices[i];
                if(temp > index){
                    index = temp;
                }
            }
        }
        return index;
    }
}
📈复杂度分析

时间复杂度:因为遍历两次,嵌套遍历,所以O(n)*O(n) = O(n2)

空间复杂度:O(1)

💡思路2:一次遍历

  • 目标:我们需要在最低的时候买入,最高的时候卖出
  • 定义一个中间变量,记录最低的价格min,那么第i天的利润就是prices[i] - min
📝代码实现
class Solution {
    public int maxProfit(int[] prices) {
        //最大值
        int max = Integer.MAX_VALUE;
        int min= 0;
        for(int i = 0; i < prices.length; i++){
            //如果当前元素 < max,则重新赋值给max
            if(prices[i] < max){
                max = prices[i];
            }
            else if(prices[i] - max > min){
                //min保存最小值
                min = prices[i] - max;
            }
        }
        return min;
    }
}
📈复杂度分析

时间复杂度:O(n),只需要遍历一次。

空间复杂度:O(1),只使用了常数个变量。

409. 最长回文串

❓题目描述

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。

在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。

👉题目示例

示例 1:

输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

示例 2:

输入:s = "a"
输入:1

示例 3:

输入:s = "bb"
输入: 2

💡题目解析

回文串:正读和反读都相同的字符序列

  • 奇数个字符:则最中间的字符只有一个
  • 偶数个字符:则字符都是成对存在

所以,题目可转化为判断字符出现的次数,若是长度为奇数个,则最长回文串为:成对存在的字符长度+1;若是偶数个,则最长回文串为:成对存在的字符长度

题目实现中,采用的set集合,当然用map/数组都可实现,原理都是一样的

📝代码实现

class Solution {
    public int longestPalindrome(String s) {
        int length = s.length();
        if(1 == length){
            return 1;
        }
        Set<Character> set = new HashSet<Character>();
        for(int i =0; i < length; i++){
            //获取字符
            char c = s.charAt(i);
            //如果存在字符,则移除,不存在则添加
            if(!set.remove(c)){
                set.add(c);
            }
        }
        //set为空,则整个都是回文串 
        //不为空,剩下的则是奇数个字符,长度 = length - set.size() + 1
        return set.isEmpty() ? length : length - set.size() + 1;
    }
}

📈复杂度分析

时间复杂度:遍历的次数为1,长度为字符串的长度,所有复杂度为O(n)

空间复杂度:O(1)

posted on 2022-09-06 09:01  小熊学Java  阅读(30)  评论(0)    收藏  举报