第一题 删除排序数组中的反复项
题目信息
给你一个有序数组 nums,请你 原地 删除反复呈现的元素,使每个元素 只呈现一次,返回删除后数组的新长度。
不要应用额定的数组空间,你必须在 原地 批改输出数组 并在应用 O(1) 额定空间的条件下实现。
阐明:
为什么返回数值是整数,但输入的答案是数组呢?
请留神,输出数组是以「援用」形式传递的,这意味着在函数里批改输出数组对于调用者是可见的。
你能够设想外部操作如下:
// nums 是以“援用”形式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里批改输出数组对于调用者是可见的。
// 依据你的函数返回的长度, 它会打印出数组中 该长度范畴内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
示例 1:
输出:nums = [1,1,2]
输入:2, nums = [1,2]
解释:函数应该返回新的长度 2,并且原数组 nums 的前两个元素被批改为 1, 2。不须要思考数组中超出新长度前面的元素。
示例 2:
输出:nums = [0,0,1,1,1,2,2,3,3,4]
输入:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5,并且原数组 nums 的前五个元素被批改为 0, 1, 2, 3, 4。不须要思考数组中超出新长度前面的元素。
提醒:
0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列
解题思路
1. 数组为有序数组
2. 数组的反复数字能够被笼罩
所以咱们能够设置两个指针,一个用来查找应返回的元素,一个用来指向能够被笼罩的冗余项。当第一个指针查找残缺个数组之后,第二个指针能够返回切片答案
代码
func removeDuplicates(nums []int) int {n := len(nums)
if n == 0 {return 0}
slow := 1
for fast := 1; fast < n; fast++ {if nums[fast] != nums[fast-1] {nums[slow] = nums[fast]
slow++
}
}
return slow
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-tudo/
起源:力扣(LeetCode)著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。
复杂度剖析
工夫复杂度:O(n),其中 n 是数组的长度。快指针和慢指针最多各挪动 n 次。
空间复杂度:O(1),只须要应用常数的额定空间。
第二题 交易股票的最佳时机 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。
示例 2:
输出: prices = [1,2,3,4,5]
输入: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 5)的时候卖出, 这笔交易所能取得利润 = 5-1 = 4。
留神你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参加了多笔交易,你必须在再次购买前发售掉之前的股票。
示例 3:
输出: prices = [7,6,4,3,1]
输入: 0
解释: 在这种状况下, 没有交易实现, 所以最大利润为 0。
提醒:
1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104
解题思路
咱们须要在股票第二天增长的时候买入减少收益,在股票上涨的时候售出缩小损失
因而能够先计算出每一天买入股票之后第二天的预期收益
选取收益为负数的天数买入股票
算法思路实质是贪婪算法
代码
func maxProfit(prices []int) int {if len(prices)==1{return 0}
maxProfit:=0
for i,_:=range prices[:len(prices)-1]{prices[i]=prices[i+1]-prices[i]
if prices[i]>0{maxProfit+=prices[i]
}
}
return maxProfit
}
复杂度剖析
工夫复杂度:O(n),实现了一次次数为 n - 1 的 for 循环
空间复杂度:O(n),定义了变量 maxProfit