leetcode 146. LRU缓存机制 middle
题目 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。
进阶: 你是否可以在 O(1) 时间复杂度内完成这两种操作? 解题方法 采用hash+double-linked实现LRU缓存算法机制. 先独立写个双链表, 然后引用双链表和hash实现LRU
双链表 有些多除的方法,主要为了调试使用.
type Linkeder interface {
AddHead(key, value int) *LinkedNode //插入头位置
Append(key, value int) *LinkedNode //追求到尾部
RemoveNode(node *LinkedNode) bool //删除指定位置的节点
RemoveTail() *LinkedNode //删除尾部的节点
Reverse() *LinkedNode //反转链表
Print() string //打印链表
PrintLink(head *LinkedNode) string
}
type LinkedNode struct {
key int //key
value int //value
next *LinkedNode //next pointer
prev *LinkedNode //prev pointer
}
type Linked struct {
length int //链表长度
head *LinkedNode //链表头部节点
tail *LinkedNode //链表尾部节点
}
func NewLinked() Linkeder {
return &Linked{}
}
//插入头部操作.leetcode 14. 最长公共前缀 simple
题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “"。
输入: [“flower”,“flow”,“flight”] 输出: “fl”
输入: [“dog”,“racecar”,“car”] 输出: "” 解释: 输入不存在公共前缀。
解题思路 解法一: 挨个比较 首先要注意边界条件, 数组为空的情况 先找到数组里最短的字符串,因为题目是求最短前缀,必须先找最短的字符串 拿最短字符串与数组里每一个字符串的每一个字符进行比较. 如果不相等则截取,即获取最短前缀. 注意这里是最外层循环是最短的字符串循环, 然后里层循环是数组循环, 挨个字符串进行比较. 也就是查看所有的字符串与最短的字符串是否一致.如果出现不一致则截取返回. func LongestCommonPrefix(strs []string) string {
l := len(strs)
if l == 0 { //边界条件
return ""
}
short := strs[0]
//从数组里查找到最小字符串.
for i := 1; i < l; i++ {
if len(short) > len(strs[i]) { //只要存在比第一个字符还短的则进行赋值操作.
short = strs[i]
}
}
//如果最短字符串长度为0则,返回空
if len(short) == 0 { //边界条件 .感触 为了坚持学习算法, 每篇算法标题写上坚持多少天,以此鼓励自己坚持学下去. 会把自己理解的都写在代码处, 你在看代码时也方便, 为什么这一行这么写. 也是锻炼自己的文档水平.
题目 LeetCode:41题, 困难
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1 要求: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间
解法一: 利用map+for-range实现 Time: O(n), Space:O(n)不符合题目要求
//解法一: 利用map+for-range实现.时间复杂度O(n), 空间是常数O(n) // 4 ms 2.8 MB func FirstMissingPositive(nums []int) int { hash := make(map[int]struct{}, len(nums)) for i := 0; i < len(nums); i++ { hash[nums[i]] = struct{}{} } fmt.Println(hash) //1-n之间检查, 如果有缺失则是最小值. for i := 1; i <= len(nums); i++ { //从1循环到n, 包含n if _, ok := hash[i]; !LeetCode:11题, 中等
解析题目 解析题目: 将数组想象成一个矩形, 寻找这个矩形盛最多水的大小. 决定盛水高度取决于最低的那根木板.也就是数字最小的那个值, 决定盛水最多还得取决于它的长度.也就是数组的头与尾之间的距离.
暴力求解. 对数组从小到大都查看一遍, 取最大容器的那个.
//暴力求解
//Time:O(n^2), Space:O(1)
func ContainerWithMostWater(height []int) int {
if len(height) == 0 {
return 0
}
//暴力求解, 任何可能都不放过.
maxArea := 0 //存放最大面积的变量.
for i := 0; i < len(height); i++ {
for j := i + 1; j < len(height); j++ {
//获取最短板的那个数字,也就是最小值的数字
minHeight := height[i]
if height[j] < minHeight {
minHeight = height[j]
}
//获取j与i之间的差距离.
distance := j - i
//求面积.参考 https://www.cyhone.com/articles/analisys-of-golang-rate/ https://www.cyhone.com/articles/analysis-of-uber-go-ratelimit/图解 参考 Go net / http超时的完整指南 https://blog.cloudflare.com/exposing-go-on-the-internet