作者:TeddyZhang,公众号:算法工程师之路 Day 8, C/C++知识点走起~ 1 编程题 【剑指Offer】翻转链表 输入一个链表,反转链表后,输出新链表的表头。 nullptr; return newHead; } }; 如果不使用额外的空间的话,我们可以使用两个指针pre和next, 对链表相邻的两个节点进行交换调整,这才是面试官想要看到的算法 = nullptr){ cur->next = pHead2; } return pHead->next; } }; 2 概念题 【C/C
ma.count(t)) ret += ma[t]; ma[sum]++; } return ret; } }; 4.运行结果 总结 今天是算法练习的第 8天。
可以使用基于广度优先搜索(BFS)的算法来计算有向图的传递闭包,其时间复杂度为 ,其中 是图中顶点的数量, 是图中边的数量。 算法思路 1. 计算传递闭包的一个经典算法是 Floyd-Warshall 算法,它的时间复杂度是 。 讯飞星火: 计算有向图的传递闭包是一个经典的图论问题,可以使用Floyd-Warshall算法来解决。该算法的时间复杂度为 ,其中 是图中顶点的数量。 计算传递闭包的一个常见方法是使用 Floyd-Warshall 算法,该算法的时间复杂度为 (O(V^3))。 然而,你要求的是 (O(VE)) 时间复杂度的算法。 在数学中,有向图的传递闭包可以通过Warshall算法(也称为Roy-Warshall算法)来计算,该算法的时间复杂度为O(V^3),但可以通过优化减少到O(VE)。
我扫了一眼代码,心想这题挺经典的,来,我给你捋一捋。 ##算法题:Word Break 题目理解 题目说给你一个字符串 s 和一个单词列表 wordDict。 这题的关键点在于理解动态规划的状态转移。dp[i] 表示前 i 个字符能否拆分,如果某个位置 j 之前能拆分,而且 s[j:i] 是字典里的词,那 dp[i] 就能拆分。
我扫了一眼代码,心想这题挺经典的,来,我给你捋一捋。 ##算法题:House Robber 题目理解 题目说你是专业小偷,计划偷窃沿街的房屋。 这题的关键点在于理解动态规划的状态转移。每家有两种选择:偷或不偷。如果偷这一家,上一家就不能偷,所以是dp[i-2]+nums[i]。如果不偷这一家,就是dp[i-1]。取两者最大值就是最优解。
我扫了一眼代码,心想这题挺经典的,来,我给你捋一捋。 ##算法题:Best Time to Buy and Sell Stock 题目理解 题目说给你一个数组 prices,prices[i] 是第 i 天的股票价格。 设计算法计算你能获取的最大利润。 注意不能在买入前卖出,也就是买入日期必须在卖出日期之前。 举例说明: 输入 [7,1,5,3,6,4],输出 5。 这题的关键点在于理解一次遍历的思路。我们要找最低的买入价和最高的卖出价,但不能简单找最小值和最大值,因为买入必须在卖出之前。所以要用一次遍历,维护历史最低价,同时计算每次卖出的利润。
具体地说,对于 f(n, m) 属于 O(g(n, m)),意味着存在正常量 c 和 N,使得当 n>=N 或 m>=M 时,f(n, m) ≤ c * g(n, m)。类似地,对于 f(n, m) 属于 Ω(g(n, m)),意味着存在正常量 c 和 N,使得当 n>=N 或 m>=M 时,f(n, m) ≥ c * g(n, m)。对于 f(n, m) 属于 θ(g(n, m)),意味着存在正常量 c1、c2 和 N,使得当 n>=N 或 m>=M 时,c1 * g(n, m) ≤ f(n, m) ≤ c2 * g(n, m)。
具体地说,对于 f(n, m) 属于 O(g(n, m)),意味着存在正常量 c 和 N,使得当 n>=N 或 m>=M 时,f(n, m) ≤ c g(n, m)。类似地,对于 f(n, m) 属于 Ω(g(n, m)),意味着存在正常量 c 和 N,使得当 n>=N 或 m>=M 时,f(n, m) ≥ c g(n, m)。对于 f(n, m) 属于 θ(g(n, m)),意味着存在正常量 c1、c2 和 N,使得当 n>=N 或 m>=M 时,c1 g(n, m) ≤ f(n, m) ≤ c2 g(n, m)。
引言:当你作为一个初学Java算法题的小白,可以点进来看看我这些算法基础题,能够很好的帮助你打好算法基本功。打好基础,才能更上一层楼。速速开始学起这些算法题吧! 3:%f格式符 输入一个实数,第一次按实型输出;第二次保留2位小数输出;第三次保留3位小数但最小列宽8列输出,空格分隔。 (); stringBuilder.append(str).reverse(); System.out.println(stringBuilder); } } 8:
前言 本文记录了我对打印算法题的总结。先说说什么事打印算法题,就是按照一定的规则打印二维矩阵。 2 9 10 11 12 15 11 7 3 13 14 15 16 16 12 8 4 接下来,将会有几道打印算法题 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ========= 13 9 5 1 14 10 6 2 15 11 7 3 16 12 8 4 例如:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为:1,2,3,4,8,12,16,15,14,13,9, 5,6,7,11, 10 【要求】 额外空间复杂度为 例如在第一二道题,我们都是通过解决外矩阵后,再解决内矩阵的方式解决问题的。 2、设计一个子模块打印函数 例如给定左上角和右上角打印一个矩阵等打印函数,记住一些常用的打印函数,可以让我们更快地解决问题
序列的变化情况采样如下: 20,15,21,25,47,27,68,35,84 15,20,21,25,35,27,47,68,84 15,20,21,25,27,35,47,68,84 请问采用的是以下哪种排序算法
1、项目经理确定项目可交付成果延迟。项目落后于进度,并超过预算5%。在审查文件和状态报告之后,项目经理下一步该怎么做?C A、执行风险再评估,作为监督风险过程的组成部分 B、更改进度基准,作为控制
为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 11,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 11
面试发现自己的算法知识有不足,因此参考了多篇文章学习总结。 冒泡排序 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较 冒泡排序最好的时间复杂度为O(n),是一种稳定排序算法。 快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 不指定算法的数组排序 let arr = [16, 31, 12, 1, 9, 12, 10]; arr.sort((a, b) => a - b); // 从小到大 4. 譬如[7, 8, 4, 9, 9, 15, 3, 1, 10]这个数组的计算值是 11 ( 15 - 4 ) 而不是 14 (15 - 1),因为 15 的下标小于 1。
为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 11,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 11
#include <stdio.h> #include <string.h> #define MAX 1000 struct Node{ int v,net; }; struct Node node[MAX]; int main(){ int n,e,t,i,x,y,z,head[MAX],que[MAX],map[MAX/2][MAX/2],qh,qt; while(scanf("%d %d",&n,&e)!=EOF){ memset(head,-1,sizeof(head)); for(i = 0;i < e;i++){ scanf("%d %d",&x,&y); node[i].v = y; node[i].net = head[x]; head[x] = i; } scanf("%d",&t); while(t--){ z = 0; memset(map,0,sizeof(map)); qh = qt = 1; scanf("%d %d",&x,&y); if(x == y){ printf("yes\n"); continue; } que[qt++] = x; while(qh < qt){ for(i = head[que[qh]];i != -1;i = node[i].net){ if(map[que[qh]][node[i].v] == 0){ map[que[qh]][node[i].v] = 1; que[qt++] = node[i].v; } if(node[i].v == y){ z = 1; break; } } if(z == 1) break; qh++; } if(z == 1) printf("yes\n"); else printf("no\n"); } printf("\n"); } return 0; }
示例1: 输入: hello nowcoder 输出:8 说明:最后一个单词为nowcoder,长度为8 解题: public static int lastLenOfStr(String input value <= 100000 输入描述: 先输入键值对的个数n(1 <= n <= 500) 接下来n行每行输入成对的index和value值,以空格隔开 输出描述: 输出合并后的键值对(多行) 8.
# LeetCode 算法题 简单 两数之和 回文数 罗马数字转整数 合并两个有序链表 每天一道,没坚持下去 # 简单 # 两数之和 题目地址 (opens new window) 给定一个整数数组 nums,第一个元素6,不在哈希表中,key为6,value为0,存入哈希表;遍历元素3,与之对应的元素应该是target-3=5,5不在哈希表中,key为3,value为1,存入哈希表中;遍历到元素8, 与之对应的元素应该是target-8=0,0不在哈希表中,key为8,value为2,存入哈希表中;遍历到元素2,与之对应的元素应该是target-2=6,6在哈希表中;因此6和2就是我们要找的两个元素 ,对应的下标分别是0,3,将数组[0,3]返回即可,算法到此结束。 方法二:迭代 思路 我们可以用迭代的方法来实现上述算法。
---- 摘自传智播客公开课 ---- package test; import java.util.Scanner; public class Arithmetic3 { //题设 break; case 7: System.out.println("老年"); break; case 8:
算法题目 题目:打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方。 算法分析 根据题目分析,水仙花是三位数是 个位+十位+百位 自身次方等于该数本身,那么计算一个数是否是水仙花数要将这个数的 个位数 十位数 百位数给分解出来伪代码如下: a = i/100; 10; //获取3位数中十位的数 c=i%100%10; //获取3位数中个位的数 这样就可以通过循环来过滤出一个区间的水仙花数量了 算法