class Solution:
# TLE On^2
def maxProfit(self, prices: List[int]) -> int:
profit = 0
n = len(prices)
for i in range(n):
for j in range(i+1,n): # 不同的日子卖
profit = max(profit, prices[j]-prices[i])
return profit
# 考虑DP
def maxProfit(self, prices: List[int]) -> int:
# 第j天的最大利润 = 第j天卖 - 前j天的最小值
# dp[j] = max(dp[j-1], prices[j]-minPrice[j])
n = len(prices)
dp,minPrice = [0] * n,[0] * n
dp[0] = 0
minPrice[0] = float('inf')
for j in range(1,len(prices)):
minPrice[j] = min(minPrice[j-1], prices[j-1])
maxP = max(dp[j-1], prices[j]-minPrice[j])
return dp[-1]
func maxProfit(prices []int) int {
// corner case
n := len(prices)
if n<=1 {
return 0
}
dp := make([]int,n)
minPrice := make([]int,n)
dp[0] = 0
minPrice[0] = prices[0]
for j:=1; j<n; j++ {
minPrice[j] = min(minPrice[j-1], prices[j])
dp[j] = max(dp[j-1], prices[j]-minPrice[j-1])
}
// go 1.21 后内置max,min,clear 函数
ret := dp[0]
for _,v := range dp {
ret = max(ret,v)
}
// ret = max(dp[:])
return ret
}
func findShortestSubArray(nums []int) int {
// 先找出nums 中的频次最大值
freq := make(map[int]int)
maxf := 0
ret := math.MaxInt
arr := map[int][]int{}
for _,v := range(nums) {
freq[v]+=1
maxf = max(maxf, freq[v])
}
// fmt.Print(freq,maxf)
// 找出最短的连续频次子数组
// 子数组连续
for k,v :=range(nums){
if freq[v] !=maxf{
continue
}
// 存储所有下标
// if arr[v] == nil {
// arr[v] = []int{k} // 使用字面量初始化
// } else {
arr[v] = append(arr[v], k)
// }
if len(arr[v]) >= maxf {
// arr[v] 中的倒数第 maxf 个元素
ret = min(ret, 1+ k- arr[v][len(arr[v])-maxf])
}
}
return ret
}
左边最大,右边最小, 结果相加时 条件1和条件2 取一个。
func sumOfBeauties(nums []int) int {
// nums[i] 前的最大值, nums[i] 后面的最小值
// 10^5 数据量不小 考虑下On
n:=len(nums)
// 默认第三种情况
// third := make([]int,n)
// 计算第二种情况
second := make([]int,n)
// 循环一下还是range , 每个下标 1<=i<=n-2
for i:=1;i<=n-2;i++ {
if nums[i-1] < nums[i] && nums[i] < nums[i+1]{
second[i] = 1
}
}
// 计算第一种情况
first,left,right := make([]int,n),make([]int,n),make([]int,n)
// i 左侧最大值, i 右侧最小值
maxv,minv := math.MinInt,math.MaxInt
left[0] = math.MinInt
for i:=1;i<=n-2;i++ {
maxv = max(maxv, nums[i-1])
left[i] = maxv
}
right[n-1] = math.MaxInt
for i:=n-2;i>0;i--{
minv = min(nums[i+1],minv)
right[i] = minv
}
for i:=1;i<=n-2;i++ {
if left[i] < nums[i] && nums[i] < right[i]{
first[i] = 2
}
}
ret := 0
for i:=1;i<n-1;i++{
if first[i] == 2{
ret+= first[i]
} else if second[i] == 1{
ret+= second[i]
}
}
return ret
}
func maxProfit(prices []int) int {
// 可以多次买卖, 利润的和, 不限制买卖次数
ret :=0
for k,v := range(prices[1:]) {
ret+= max(0, v-prices[k])
}
return ret
}
func partitionDisjoint(nums []int) int {
// 两次遍历,找到左边最大值, 右边最小值 kadane
// 对每个位置,求左边的最大值小于右边的最小值, left 尽可能小,左边的第一个就是
n:=len(nums)
left := make([]int, n)
right := make([]int,n)
left[0] = nums[0] // left 包含自己
for i:=1;i<n;i++{
left[i] = max(left[i-1], nums[i])
}
right[n-1] = math.MaxInt
for i:=n-2;i>=0;i--{
right[i] = min(right[i+1],nums[i+1])
}
ret := 0
for i:=0;i<=n-2;i++{
if left[i]<=right[i]{
ret=i+1
break
}
}
fmt.Println(left,right)
return ret
}
func partitionString(s string) int {
// 使用位运算bitmap
ret := 1
bit := 0
for _,c :=range(s){
// fmt.Print(bit)
if (bit >> (c&31)) & 1 == 1 {
ret++
bit = 0
}
bit |= 1<<(c&31)
}
return ret
}
825

被折叠的 条评论
为什么被折叠?



