队列

1.最近的请求次数,属于窗口类题型,都是使用队列把前面不符合的去掉,再进行计算剩下的
int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
解法:通过保持数据都是3000毫秒内的数据进行计数,换句话说就是每次 新t进来,就把3000毫秒外的删除。
用队列解决:

class RecentCounter {
 var queue = [Int]()
    init() {

    }

    func ping(_ t: Int) -> Int {
        if queue.count == 0 {
            return 1
        }
        while queue.first! > t - 3000 {
            queue.removeFirst()
        }
        return queue.count
    }
}

用数组的官方方法解决:时间为100%,内存77%

 var array = [Int]()
    init() {

    }

    func ping(_ t: Int) -> Int {
        array.removeAll {$0 < t - 3000  }
        array.append(t)
        return array.count
    }

2.[无法吃午餐的学生数量]
学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表示。所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的。
餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个 栈 里,每一轮:

如果队列最前面的学生 喜欢 栈顶的三明治,那么会 拿走它 并离开队列。
否则,这名学生会 放弃这个三明治 并回到队列的尾部。
这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。

给你两个整数数组 students 和 sandwiches ,其中 sandwiches[i] 是栈里面第 i 个三明治的类型(i = 0 是栈的顶部), students[j] 是初始队列里第 j 名学生对三明治的喜好(j = 0 是队列的最开始位置)。请你返回无法吃午餐的学生数量。

解法:把喜欢吃午餐的学生分类,得到每类学生的个数,数组/字典表示,然后根据遍历三文治,根据元素把响应学生减少,直到一类学生个数为0,说明此轮此类三文治还有,但学生上轮已经轮完,没有了,那说明此类三文治已经无法被选完,所以说明游戏已经到了结束的时候,那这时可以返回各类学生的个数,也就是无法吃午餐的学生数。
数组解法:时间空间双100%。

func countStudents(_ students: [Int], _ sandwiches: [Int]) -> Int {
        // 分两类学生,喜欢圆形/方形
var stuLike = [Int](repeating: 0, count: 2)
        for x in students {
            // 把所有学生遍历分类
            stuLike[x] += 1
        }
        // 把三文治遍历,通过对应0,1 获取对应学生进行匹配减少
        for y in sandwiches {
            // 当其中一类学生为0,说明三文治还有,但喜欢此类别的学生已经没有了,说明三文治肯定无法被调完,退出遍历
            if stuLike[y] == 0 {
                break
            }
            stuLike[y] -= 1
        }
        // 此时返回的就是最终无法挑中喜欢三文治的两类学生总数
        return stuLike[0] + stuLike[1]
    }

字典解法,时间为33%,空间33%,不是最佳解法。

func countStudents(_ students: [Int], _ sandwiches: [Int]) -> Int {
       if  students.count == 0 {
            return 0
        }
        var map = [Int: Int]()
// 需要初始化两类为0
        map[0] = 0
        map[1] = 0
        for student in students {
           
            map[student]! += 1
          
        }
        for san in sandwiches {
            if map[san] == 0 {
                break
            }
            map[san]! -= 1
        }
        return (map[0] ?? 0) + (map[1] ?? 0)
    }

你可能感兴趣的:(队列)