码不停题: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)
浙公网安备 33010602011771号