Java 改进性能
如何提高我在下面编写的代码的性能以处理以下问题 N是圆中的对象数。我从Java 改进性能,java,algorithm,Java,Algorithm,如何提高我在下面编写的代码的性能以处理以下问题 N是圆中的对象数。我从0开始,然后进行M跳跃,访问圆圈中的每个对象。如果重复某个对象,则我将停止,并且访问的对象数是我的答案 当前代码 // you can also use imports, for example: import java.util.*; // you can use System.out.println for debugging purposes, e.g. // System.out.println("this is
0
开始,然后进行M
跳跃,访问圆圈中的每个对象。如果重复某个对象,则我将停止,并且访问的对象数是我的答案
当前代码
// you can also use imports, for example:
import java.util.*;
// you can use System.out.println for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
public int solution(int N, int M) {
// write your code in Java SE 8
int answer =1;
HashMap<Integer , Integer> som = new HashMap<>();
boolean check = true;
int x =0;
som.put(0,0);
while(check){
int m = (x+ M) % N ;
x = m;
if(som.containsKey(x))
check = false;
else{
som.put(x,0);
answer++;
}
}
return answer;
}
//您也可以使用导入,例如:
导入java.util.*;
//您可以使用System.out.println进行调试,例如。
//System.out.println(“这是一条调试消息”);
类解决方案{
公共整数解决方案(整数N,整数M){
//用JavaSE8编写代码
int-answer=1;
HashMap som=新的HashMap();
布尔检查=真;
int x=0;
som.put(0,0);
while(检查){
int m=(x+m)%N;
x=m;
if(som.containsKey(x))
检查=错误;
否则{
som.put(x,0);
回答++;
}
}
返回答案;
}
这不适合10^6码的号码,这样比较干净
public int solution(int N, int M) {
Set<Integer> set = new HashSet<>(N);
int m = 0;
int ans = 0;
while(set.add(m)) {
m = (m + M) % N ;
ans++;
}
return ans;
}
public int解决方案(int N,int M){
Set=新哈希集(N);
int m=0;
int ans=0;
while(set.add(m)){
m=(m+m)%N;
ans++;
}
返回ans;
}
< p >如果将n和m分解成素因子(即n=p)[2 ] ^ [e ] [2 ] *…和m=p [1 ] ^ f [1 ] *[p[2 ] ^ [f](2)…)并考虑它们的指数e[1,e[2 ],…和f[1,f[2 ],那么答案是p[ung] ^ max(α,e[[y] -f[y])*p[y] ^ max(α,e[y] -f[y])……这是数学上的,但应该是解决方案。< /P> < /代码>
例如,N=120,M=18
N可以写成2^3*3^1*5,M可以写成2^1*3^2。现在我们的解是2^(3-1)*5,等于20
编辑:
这背后的原因,这之所以有效是因为以下观察结果。如果你跳到一个已经去过的地方,那么它必须是0。所以我们试图找到最小值x,使得x*m=0(mod n)。我描述了如何通过考虑主要因素来找到x。实现只是一个练习。为什么要使用哈希图
?只是为了检查访问的点。这个问题更适合。发件人:如果您正在以下领域寻找项目中特定工作代码的反馈…最佳实践设计模式使用安全性问题在意外情况下的性能正确性算法名称是什么?需要更多的解释吗?性能没有提高我不认为对于非常高的N值,你可以做得更好…除非你做一些数学来找到窍门。这超出了你的问题范围。太棒了!我尝试了根据你的例子,我认为你把f
和e
的角色分开了。它不应该是max(0,e[I]-f[I])?我对你的答案投了更高的票,因为它似乎是正确的,但我不完全理解。为什么你说如果你跳到一个已经去过的地方,那么它一定是0
?这是一个非常直观的假设,很抱歉没有澄清它。在我看来,如果我们从a点开始,然后到b点,到c点等等,我们将得到a->b->c点->…->a我们将再次到达a,这个循环再次开始。所以我想a(或0)将是我们再次访问的地方。