【复盘】LeetBook初级算法 -- 数组

  • 删除排序数组中的重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

解题思路:
去重题,用双指针法(哨兵).
slow指针指向当前位置,fast指针向后搜索直到与slow位置的值不同时fast停止,赋值到slow后边的一个位置.
时间复杂度O(n),空间复杂度O(1)
注意:
1.++slow与fast++.写入位置是slow的后一个,而fast此时指向的是不同值得元素.

  • 买卖股票的最佳时机 II

给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。
在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
示例 1:
输入: prices = [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

贪心法
每次在股价波段的最低点买入,在波段的最高点卖出.每个波段都这样操作,获得最大利润.
吃到每个股价上升区间的利润.每个股价下降区间都不买入,不会有任何损失.

int ans = 0;
for(int i=1; i<n; i++)
{
   
	ans += max(0, price[i]-price[i-1]);
}
return ans;

动态规划法
每天结束时,有两种状态,持有股票or没有持有股票
定义dp[i][0]为第i天结束后,没有持有股票状态,获得的最大利润.
定义dp[i][1]为第i天结束后,持有股票状态,获得的最大利润.
状态转移方程:
//要么第i天就是空仓,第i+1天还是空仓,没有操作,最大利润不变.
//要么第i天持有股票,第i+1天变成空仓,意味着当天以price[i+1]的价格卖出,获得相应收入
//上述两种情况,取较大值
dp[i+1][0] = max(dp[i][0], dp[i][1]+price[i+1])

//要么第i天就持有股票,第i+1天继续持有,没有操作,最大利润不变.
//要么第i天空仓,第i+1天持有股票,意味着当天以price[i+1]的价格买入,花费相应成本
//上述两种情况,取较大值
dp[i+1][1] = max(dp[i][1], dp[i][0]-price[i+1])

初始值:
dp[0][0] = 0
dp[0][1] = -price[0]

//略.可以优化空间复杂度为O(1),只记录最近一天两种状态的值.
  • 旋转数组

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

1.普通挪动法,使用额外空间.
a)分配k个空间,储存后k个数字.
b)前面n-k个数字,倒着平移挪动.
c)把第一步的k个数字放在前边.

2.轮转法
a)num[start]替换到next=(i+k)%n位置.
b)以此类推,直到next == start或者替换次数等于n
c)如果替换次数小于n,start++.继续步骤a

int start = 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值