【中等】水果成篮

【中等】水果成篮

题目链接: https://leetcode.cn/problems/fruit-into-baskets/

  最初思路:从左到右遍历,按先后顺序记下两个篮子的水果种类和起始坐标。如果新的水果不属于这两个水果,那就扔掉第一个水果,然后将当前水果作为第二个水果。
  问题:当扔掉第一个水果时,第二个水果与当前水果之间可能仍然存在被扔掉的水果。
  第一次修改:记录最后一种水果的起始坐标。当扔掉第一个水果时,将起始坐标作为新的第一个水果的坐标。
  问题:遇到第三种水果时,前一个水果不一定是第二种水果。
  第二次修改:记录最后一个水果种类和起始坐标,以及两个篮子的水果种类。当遇到第三种水果时扔掉所有水果,将篮子里的水果设置为当前水果和最后一个水果。当没有遇到新水果但是与前一个水果不同时,更新最后一个水果的种类和起始坐标。

class Solution {
    func totalFruit(_ fruits: [Int]) -> Int {
        var max = 0
        var fruit1: Int?
        var fruit2: Int?
        var lastFruit: Int?
        var start = 0
        var lastStart = 0
        
        for (i, fruit) in fruits.enumerated() {
            if fruit != fruit1 && fruit != fruit2 {
                let length = i - start
                if length > max {
                    max = length
                }
                fruit1 = lastFruit
                fruit2 = fruit
                start = lastStart
                lastStart = i
                lastFruit = fruit
            } else {
                if fruit != lastFruit {
                    lastStart = i
                    lastFruit = fruit
                }
            }
        }
        let length = fruits.count - start
        if length > max {
            max = length
        }
        return max
    }
}

修订记录

2022-10-22T10:51:57+08:00