关于golang:golangleetcode初级删除排序数组中的重复项买卖股票的最佳时机-II

8次阅读

共计 2001 个字符,预计需要花费 6 分钟才能阅读完成。

第一题 删除排序数组中的反复项

题目信息

给你一个有序数组 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

正文完
 0