首页
畅所欲言
友情链接
壁纸大全
数据统计
直播
Search
1
职教云小助手重构更新,职教云助手最新版下载地址【已和谐】
11,985 阅读
2
职教云-智慧职教,网课观看分析(秒刷网课)
9,932 阅读
3
gradle-5.4.1-all.zip下载
7,838 阅读
4
职教云-智慧职教,签到补签分析(逆天改命系列)
7,117 阅读
5
一个优秀的程序员从写文档开始:免费领14个月语雀云笔记会员
6,491 阅读
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
登录
/
注册
Search
标签搜索
弹性布局
Lan
累计撰写
568
篇文章
累计收到
497
条评论
首页
栏目
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
页面
畅所欲言
友情链接
壁纸大全
数据统计
直播
搜索到
103
篇与
算法刷题
的结果
2023-01-14
剑指 Offer 10- I. 斐波那契数列,斐波拉契,递归优化法,动态规划法,及其优化
前言b站摸鱼,看见了这个视频,妙呀。先是递归,通过空间换时间。又是动态规划,优化空间。视频放在最后面了。前面是我个人学习笔记。笔记递归法up主直接三目运算符了,虽然代码简洁,但可读性体验感也会降低。体谅一下将来的我,还能看懂,所以我这里就拆开了。最基本的递归,求斐波拉契的第n项def fb_dg(n): if n < 2: return n return fb_dg(n - 1) + fb_dg(n - 2)如果要计算n项之和的话,就多了很多次重复的计算,因为每次都需要从n开始,一直减。然后可以新建一个list(虽然字典无序+哈希,检索比list要快,时间复杂度为O(1),而list为O(n),但是好像我们这个直接根据下标,所以用list更快),并且需要创建n+1个初始值,防止出现下标越界的情况。用于存放每次计算的结果,如果没有结果再进行计算。先来看一下效果,一个字6,本来想放毫秒的,但是它的实力不允许。def fb_dg_zd(n, r: list): if n < 2: return n v = r[n] if v != -1: return v else: r[n] = fb_dg_zd(n - 1, r) + fb_dg_zd(n - 2, r) return r[n]对比一下老方法。我已经不想等了,没有对比就没有伤害,在这个空间不值钱的时代,666。我想起了我之前公司项目的时候,也是用了空间换时间,我需要将某方案复制一份,包括其子项指标啥的一堆东西,是一个递归,然后我就用dict,建由于数据主键都是雪花id,所以每一条数据都是唯一的主键值,因此我只需要一个dict,并且直接存主键id即可,如果有就直接get,没有就新增进去,下次get就可以返回了,节省了很多时间。动态规划法def fb_dt(n): dp = [0, 1] + [-1 for _ in range(n - 1)] for i in range(2, n + 1): dp[i] = dp[i - 1] + dp[i - 2] return dp[n]优化空间之后,这个def fb_dt_zd(n): if n < 2: return n pre, cur = 0, 1 for i in range(2, n + 1): pre, cur = cur, pre + cur return cur时间对比,有进步,但不多,反正比原始递归强。源视频{bilibili bvid="BV1W14y1A7Eq" page=""/}Leetcode写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1:输入:n = 2 输出:1 示例 2:输入:n = 5 输出:5来源:力扣(LeetCode)链接:https://leetcode.cn/problems/fei-bo-na-qi-shu-lie-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。代码class Solution: def __init__(self): self.r = [] self.MOD = 10 ** 9 + 7 def fib(self, n: int) -> int: if n < 2: return n if len(self.r) == 0: self.r = [-1 for _ in range(n + 1)] v = self.r[n] if v != -1: return v % self.MOD else: self.r[n] = self.fib(n - 1) + self.fib(n - 2) return self.r[n] % self.MOD
2023年01月14日
10 阅读
0 评论
0 点赞
2023-01-13
【逻辑智力题】水桶倒水问题
缘起今天逛牛客,然后看见了这个题目不禁想起了我的第一份offer,当时面笔试的时候最后一道题就是这个。然后发现还有几个类似的,汇总过来,记录一下题目1、取4L的水问题:水资源无限,3L和5L水桶各一个,怎样取4L的水?步骤:5L桶装满,倒满3L桶,5L桶剩2L3L桶倒空,5L桶倒至3L桶,3L桶剩2L5L桶装满,倒满3L桶,此时5L桶剩4L2. 取3L的水问题水资源无限,5L和6L水桶各一个,怎样取3L的水?步骤:6L桶装满,倒满5L桶,6L桶剩1L5L桶倒空,6L桶倒至5L桶,5L桶剩1L6L桶装满,倒满5L桶,6L桶剩4L5L桶倒空,6L桶倒至5L桶,5L桶剩2L6L桶装满,倒满5L桶,6L桶剩3L3. 3、取2个5L的水问题一个装了10L水的桶,一个7L的空桶,一个3L的空桶,怎样变成2个5L?步骤10L桶倒满3L桶,3L桶倒至7L桶7 3 010L桶倒满3L桶,3L桶倒至7L桶4 6 010L桶倒满3L桶,3L桶倒满7L桶1 7 27L桶倒至10L桶8 0 23L桶倒至7L桶8 2 010L桶倒满3L桶,3L桶倒至7L桶5 5 0总结这种题目其实有多种解法,我当时做出来后,回来和我同学说,发现有些同学的方法和我不一样,但是结果是对的。
2023年01月13日
18 阅读
0 评论
0 点赞
2023-01-13
链表设计 python
单链表class MyLinkedList: def __init__(self, head=None, size=0): self.head = head self.size = size def get(self, index): if index >= self.size or not self.head: return -1 cur = self.head while index: cur = cur.next index -= 1 return cur.val def add_at_head(self, val): self.head = ListNode(val, self.head) self.size += 1 def add_at_tail(self, val): if not self.head: self.head = ListNode(val) else: cur = self.head while cur.next: cur = cur.next cur.next = ListNode(val) self.size += 1 def add_at_index(self, val, index): if not index > self.size: if index <= 0: self.add_at_head(val) else: cur = self.head while index - 1: cur = cur.next index -= 1 cur.next = ListNode(val, cur.next) self.size += 1 def delete_at_index(self, index): if index < self.size: if not index: self.head = self.head.next else: cur = self.head while index - 1: cur = cur.next index -= 1 cur.next = cur.next.next self.size -= 1
2023年01月13日
11 阅读
0 评论
1 点赞
2023-01-12
递归,迭代 list序列化listnode 以及反序列化 python
递归法def list2node(data): # 列表转节点 if not data: return None return ListNode(data[0], list2node(data[1:])) def node2list(head): # 节点转列表 if not head: return [] return [head.val] + node2list(head.next)迭代法# 迭代法 def list2node(data): # 列表转节点 head = ListNode() p = head for i in data: p.next = ListNode(i) p = p.next return head.next def node2list(head): # 节点转列表 data = [] while head: data.append(head.val) head = head.next return data
2023年01月12日
9 阅读
0 评论
0 点赞
2022-11-17
209. 长度最小的子数组
https://www.yuque.com/lxyo/course/vb7zmoutvnp5zeeo#a0MLV给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:输入:target = 4, nums = [1,4,4]输出:1示例 3:输入:target = 11, nums = [1,1,1,1,1,1,1,1]输出:0来源:力扣(LeetCode)链接:https://leetcode.cn/problems/minimum-size-subarray-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。// // Created by Lan on 2022/11/16. // #include <vector> using namespace std; int main() { vector<int> nums = {1, 1, 7, 1, 7, 1, 2, 1}; int target = 6; int sum = 0; int start = 0; int result = INT32_MAX; int sub_length = 0; // 结束位置,从0到最后 for (int end = 0; end < nums.size(); ++end) { // 累加 sum += nums[end]; // 如果和大于等于目标值,则要对窗口大小进行修改了 while (sum >= target) { // 求当前窗口长度,并于结果进行比较和替换 sub_length = (end - start + 1); result = result < sub_length ? result : sub_length; // 不管如何都得缩小窗口了 sum -= nums[start++]; } } return result == INT32_MAX ? 0 : result; }
2022年11月17日
23 阅读
0 评论
0 点赞
2022-11-16
有序数组的平方 双指针法
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]双指针法数组其实是有序的, 只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。此时可以考虑双指针法了,i指向起始位置,j指向终止位置。定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。如果A[i] A[i] < A[j] A[j] 那么result[k--] = A[j] * A[j]; 。如果A[i] A[i] >= A[j] A[j] 那么result[k--] = A[i] * A[i]; 。https://www.yuque.com/lxyo/course/vb7zmoutvnp5zeeo?#XjKZc// // Created by Lan on 2022/11/16. // #include <vector> #include <stdio.h> using namespace std; int main() { // 初始数组 vector<int> nums = {-4,-1,0,3,10}; // 存放结果的数组 vector<int> result(nums.size(), 0); // 用于存结果的指针 int k = nums.size() - 1; // 因为原数组是有序的,但是由于平方之后有的负数会比正数大,所以可以从两边 // 同时往中间走,直到左右指针相遇。 // 遍历一次,首指针的平方与尾指针的平方比较 // 选择大的,然后放在结果指针,然后结果指针-1 for (int i = 0, j = nums.size() - 1; i <= j;) { if (nums[i] * nums[i] > nums[j] * nums[j]) { result[k--] = nums[i] * nums[i]; i++; } else { result[k--] = nums[j] * nums[j]; j--; } } // 遍历输出结果 for (int i = 0; i < result.size(); ++i) { printf("%d\t", result[i]); } return 1; }
2022年11月16日
16 阅读
0 评论
0 点赞
2022-11-09
C语言 将一个二维数组行和列的元素互换,存到另一个二维数组中
// // Created by Lan on 2022/11/9. // #include <cstdio> int main() { int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int result[3][3]; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { result[i][j] = arr[3 - j - 1][i]; printf("%d\t", result[i][j]); } printf("\n"); } return 1; }最近发东西比较频繁,因为我的图床写好了,上传图片方便多了。
2022年11月09日
24 阅读
0 评论
0 点赞
1
2
3
4
...
15