获得徽章 1
- #每日一题#
剑指 Offer II 093. 最长斐波那契数列
如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的:
n >= 3
对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}
给定一个严格递增的正整数数组形成序列 arr ,找到 arr 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。
(回想一下,子序列是从原序列 arr 中派生出来的,它从 arr 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一个子序列)
func lenLongestFibSubseq(arr []int) (ans int) {
n := len(arr)
indices := make(map[int]int, n)
for i, x := range arr {
indices[x] = i
}
dp := make([][]int, n)
for i := range dp {
dp[i] = make([]int, n)
}
for i, x := range arr {
for j := n - 1; j >= 0 && arr[j]*2 > x; j-- {
if k, ok := indices[x-arr[j]]; ok {
dp[j][i] = max(dp[k][j]+1, 3)
ans = max(ans, dp[j][i])
}
}
}
return
}
func max(a,b int) int { if a > b {return a};return b}展开评论点赞 - #每日一题# 剑指 Offer II 083. 没有重复元素集合的全排列
给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。
func permute(nums []int) (res [][]int) {
n := len(nums)
path := make([]int, 0, n)
used := make(map[int]bool,n)
var dfs func(strat int)
dfs = func(strat int){
if len(path) == n {
tmp := make([]int,len(path))
copy(tmp,path)
res = append(res, tmp)
}
for i := 0; i < n; i++ {
if !used[i] {
path = append(path, nums[i])
used[i] = true
dfs(i+1)
used[i] = false
path = path[:len(path)-1]
}
}
}
dfs(0)
return
}展开评论点赞 - #每日一题#
剑指 Offer II 072. 求平方根
给定一个非负整数 x ,计算并返回 x 的平方根,即实现 int sqrt(int x) 函数。
正数的平方根有两个,只输出其中的正数平方根。
如果平方根不是整数,输出只保留整数的部分,小数部分将被舍去。
func mySqrt(x int) int {
l,r := 0,x
res := -1
for r >= l {
mid := l + (r-l)>>1
if mid*mid <= x {
res = mid
l = mid + 1
}else{
r = mid - 1
}
}
return res
}展开评论点赞 - #每日一题# 6355. 质数减法运算
给你一个下标从 0 开始的整数数组 nums ,数组长度为 n 。
你可以执行无限次下述运算:
选择一个之前未选过的下标 i ,并选择一个 严格小于 nums[i] 的质数 p ,从 nums[i] 中减去 p 。
如果你能通过上述运算使得 nums 成为严格递增数组,则返回 true ;否则返回 false 。
严格递增数组 中的每个元素都严格大于其前面的元素。
func primeSubOperation(nums []int) bool {
pre := 0
for _, x := range nums {
if x <= pre {
return false
}
pre = x-p[sort.SearchInts(p,x-pre)-1]
}
return true
}
var p = []int{0} // 哨兵,避免二分越界
func init() {
const mx = 1000
np := [mx]bool{}
for i := 2; i < mx; i++ {
if !np[i] {
p = append(p, i) // 预处理质数列表
for j := i * i; j < mx; j += i {
np[j] = true
}
}
}
}展开评论点赞 - #每日一题#
剑指 Offer II 037. 小行星碰撞
给定一个整数数组 asteroids,表示在同一行的小行星。
对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。
找出碰撞后剩下的所有小行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。
func asteroidCollision(asteroids []int) []int {
st := make([]int,0,len(asteroids))
for _,aster := range asteroids{
alive := true
for aster < 0 && len(st) > 0 && alive && st[len(st)-1] > 0{
alive = st[len(st)-1] < -aster
if st[len(st)-1] <= -aster{
st = st[:len(st)-1]
}
}
if alive {
st = append(st,aster)
}
}
return st
}展开评论点赞 - #每日一题#
剑指 Offer II 027. 回文链表
给定一个链表的 头节点 head ,请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。
func isPalindrome(head *ListNode) bool {
s := make([]int,0)
for head != nil {
s = append(s, head.Val)
head = head.Next
}
for i := 0; i < len(s)/2; i++ {
if s[i] != s[len(s)-i-1] {
return false
}
}
return true
}展开评论点赞 - #青训营笔记创作活动#
2月9日 打卡day23
今天学习的是“为什么用公钥加密却不能用公钥解密?”因为大数取模运算是不可逆的,因此他人无法暴力解密。但是结合欧拉定理,我们可以选取出合适的p(公钥), q(私钥), N(用于取模的大数),让原本不可逆的运算在特定情况下,变得有那么点“可逆”的味道。数学原理决定了我们用公钥加密的数据,只有私钥能解密。反过来,用私钥加密的数据,也只有公钥能解密。展开评论点赞 - #青训营笔记创作活动#
2月8日 打卡day22
今天学习的是redis的面试八股,redis如何进行缓存降级?缓存降级,其实都应该是指服务降级。在访问量剧增、服务响应出现问题(如响应延迟或不响应)或非核心服务影响到核心流程的性能的情况下,仍然需要保证核心服务可用,尽管可能一些非主要服务不可用,这时就可以采取服务降级策略。
服务降级的最终目的是保证核心服务可用,即使是有损的。服务降级应当事先确定好降级方案,确定哪些服务是可以降级的,哪些服务是不可降级的。根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心服务的正常运行。展开评论点赞 - #青训营笔记创作活动#
2月6日 打卡day21
今天学习的是MySQL索引应用篇:建立索引的正确姿势与使用索引的最佳指南,索引虽然能给MySQL检索数据的效率带来质的飞跃,但加入索引没有带来新问题吗?
既然索引能够提升查询性能,那是不是为表中每个字段建立索引,性能会更好?
一张数据表中,哪些类型的字段不适合建立索引呢?又是因为什么原因呢?
表中会存在大量的字段,但其中哪些字段建立索引才能够最大的性能收益呢?
MySQL提供的索引种类也不少,一个字段上建立什么类型的索引才最好呢?
当表中存在多个索引时,一条查询SQL有多条路径可走,此时走哪条索引最好?展开评论点赞 - #青训营笔记创作活动#
2月3日 打卡day20
今天学习建立索引的正确姿势与使用索引的最佳指南,主要内容有MySQL各索引的优劣分析,建立索引的正确姿势,索引失效与使用索引的正确姿势评论点赞