首页 文章 精选 留言 我的

精选列表

搜索[匹配算法],共10000篇文章
优秀的个人博客,低调大师

leetcode算法题解(Java版)-7-循环链表

一、循环链表 题目描述 Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using extra space? 思路 不能用多余空间,刚开始没有考虑多个指针什么,一下子想到个歪点子:循环就是重复走,那我可以标记一下每次走过的路,如果遇到标记过的路,那说明就是有回路了。 代码一 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public boolean hasCycle(ListNode head) { if(head==null){ return false; } ListNode p=new ListNode(0); p=head; int u=-987123; while(p.val!=u&&p.next!=null){ p.val=u; p=p.next; } if(p.val==u){ return true; } else{ return false; } } } 思路二 当然标准的是应该用两个指针来“追赶”,前提是这两个指针走的速度不一样,一前一后如果相遇了则说明有回路。 代码二 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public boolean hasCycle(ListNode head) { if(head==null){ return false; } ListNode p=head; ListNode q=head.next; while(p!=q&&q!=null&&p!=null){ q=q.next; if(q!=null){ q=q.next; } p=p.next; } if(p==q&&p!=null){ return true; } else{ return false; } } } 优化过的代码: /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public boolean hasCycle(ListNode head) { if(head==null){ return false; } ListNode fastNode=head; ListNode lowNode=head; while(fastNode!=null&&fastNode.next!=null){ fastNode=fastNode.next.next; lowNode=lowNode.next; if(fastNode==lowNode){ return true; } } return false; } } 今天有场考试,到七点半才结束,就刷这么多了。

优秀的个人博客,低调大师

算法学习之路|POJ2689(素数筛)

题目大意:选出区间L,R之间相邻素数中差值最大和最小的素数对 素数筛(线性筛): #include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define MAX 10000000 long long su[MAX],cnt; bool isprime[MAX]; void prime() { cnt=1; memset(isprime,1,sizeof(isprime));//初始化 isprime[0]=isprime[1]=0;//0和1不是素数 for(long long i=2;i<=MAX;i++) { if(isprime[i]) su[cnt++]=i;//保存素数 for(long long j=1;j<cnt&&su[j]*i<MAX;j++) { isprime[su[j]*i]=0;//筛掉小于等于i的素数和i的积构成的合数 } } } int main() { prime(); for(long long i=1;i<cnt;i++) printf("%d ",su[i]); return 0; } 思路:直接用素数筛会超时(int范围线性复杂度时间复杂度已经达到10e9),而区间间隔比较小,只有1e6,而且对于int范围内的合数来说,最小质因子必定小于2^16。所以可以进行二次筛素数,第一次对50000以内筛素数,第二次筛出L,R区间内素数即可。 代码: #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; #define INF 1e9 #define maxn 50005 #define maxm 100005 int l,u; int su[maxn],isprime[maxn],f[maxm]; int cnt=0; void prime() { memset(isprime,1,sizeof(isprime)); isprime[0]=isprime[1]=0; for(int i=2;i<=maxn;i++) { if(isprime[i]) su[cnt++]=i; for(int j=1;j<cnt&&su[j]*i<maxn;j++) { isprime[su[j]*i]=0; } } } int main() { prime(); while(cin>>l>>u) { if(l==1)l=2;//注意l=1 memset(f,0,sizeof(f)); for(int i=0;i<cnt;i++) { int a=(l-1)/su[i]+1; int b=u/su[i]; for(int j=a;j<=b;j++) if(j>1) f[j*su[i]-l]=1; } int p=-1,max_ans=-1,min_ans=INF,x1,y1,x2,y2; for(int i=0;i<=u-l;i++)//暴力枚举 { if(f[i]==0) { if(p==-1) { p=i; continue; } if(max_ans<i-p) { max_ans=i-p; x1=p+l;y1=i+l; } if(min_ans>i-p) { min_ans=i-p; x2=p+l;y2=i+l; } p=i; } } if(max_ans==-1)cout<<"There are no adjacent primes."<<endl; else cout<<x2<<","<<y2<<" are closest, "<<x1<<","<<y1<<" are most distant."<<endl; } return 0; }

优秀的个人博客,低调大师

算法学习之路|hdu 1035 Robot Motion(模拟)

题目大意 给一个地图,由ESWN(东南西北)组成,机器人根据脚下的指令移动,求如果机器人能走出地图,走的步数多少,如果不能走出,求每绕一圈的步数和绕圈之前走的步数。 不是图的题目,直接做就行。 代码: #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; char map1[15][15]; int flag[15][15]; int main() { int n,m,k; int x,y; while(scanf("%d%d",&n,&m)&&n) { int sum1=0,sum2=0; memset(flag,0,sizeof(flag)); memset(map1,0,sizeof(map1)); scanf("%d",&k); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>map1[i][j]; } } x=1; y=k; while(x<=n&&x>=1&&y<=m&&y>=1) { if(map1[x][y]=='E') { flag[x][y]++; y++; sum2++; } else if(map1[x][y]=='W') { flag[x][y]++; y--; sum2++; } else if(map1[x][y]=='S') { flag[x][y]++; x++; sum2++; } else if(map1[x][y]=='N') { flag[x][y]++; x--; sum2++; } if(flag[x][y]==1) { sum1++; } else if(flag[x][y]>1) break; } if(sum1>0) printf("%d step(s) before a loop of %d step(s)\n",sum2-sum1*2,sum1); else printf("%d step(s) to exit\n",sum2); } return 0; }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册