判断给定的链表中是否有环
扩展:
你能给出空间复杂度的解法么?
/*
* function ListNode(x){
* this.val = x;
* this.next = null;
* }
*/
/**
*
* @param head ListNode类
* @return bool布尔型
*/
function hasCycle( head ) {
if (head == null) {
return false
}
let slow = head
let fast = head
while (fast != null && fast.next != null) {
fast = fast.next.next
slow = slow.next
if (fast === slow) {
return true
}
}
return false
}
使用快慢指针是比较高效查链表是否有环的方式
对于最后快慢指针一定会相遇我理解的不是很好,快指针fast总是比slow多1,所以经过无数轮的转圈,fast总会超过slow一圈,然后和slow相遇。
题目描述
假设你有一个数组,其中第i个元素表示某只股票在第i天的价格。
设计一个算法来寻找最大的利润。你可以完成任意数量的交易(例如,多次购买和出售股票的一股)。但是,你不能同时进行多个交易(即,你必须在再次购买之前卖出之前买的股票)。
首先说一下这个题目,我是真没读懂。看别人的解释,简化一下就是说按顺序低价买,高价卖,只要后一天比前一天的价格高就进行买卖,将每天大于0的收益加起来。而且只需要最后的结果,不需要索引
比如 1 2 3 4 1 6
价格比较 | 净赚 |
---|---|
2>1 | 1买进2卖出,净赚1 |
3>2 | 2买进3卖出,净赚1 |
4>3 | 3买进4卖出,净赚1 |
1<4 | 不买 |
6>1 | 1买进6卖出,净赚5 |
– | 总计净赚8 |
代码:
/**
*
* @param prices int整型一维数组
* @return int整型
*/
function maxProfit( prices ) {
if (prices.length < 1) {
return 0
}
let res = 0
for (let i = 1; i < prices.length; i++) {
if (prices[i] > prices[i - 1]) {
res += prices[i] - prices[i - 1]
}
}
return res
}
题目描述
假设你有一个数组,其中第\ i i 个元素是股票在第\ i i 天的价格。
你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。
这个题目的意思就是找最小值和最大值,在波谷买入,波峰卖出
/**
*
* @param prices int整型一维数组
* @return int整型
*/
function maxProfit( prices ) {
if (prices.length<2) {
return 0
}
let min = prices[0]
let max = 0
for (let i = 1; i < prices.length; i++) {
if (prices[i]<min) {
min=prices[i]
}
if (prices[i]-min>max) {
max=prices[i]-min
}
}
return max
}