LeetCode周赛题目,第一名写的代码,看不懂,求解释。

wowpH 2019-09-22 10:16:14
加精
题目链接,题目来源 LeetCode 第 9 场双周赛

算法版,版主都没有,人太少。。。只能发这里来了。

第一名uwi的代码如下:
	class Solution {
public int minKnightMoves( int x,
int y) {
return (int) knightDistance(x, y);
}

public long knightDistance( long r,
long c) {
r = Math.abs(r);
c = Math.abs(c);
if (r + c == 0)
return 0;
if (r + c == 1)
return 3;
if (r == 2 && c == 2)
return 4;

// 下面代码,,,大佬的思路理解不了。。。或者说我太菜。。。
long step = Math.max((r + 1) / 2, (c + 1) / 2);
step = Math.max(step, (r + c + 2) / 3);
step += (step ^ r ^ c) & 1;
return step;
}
}

...全文
5559 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
flybirding10011 2021-03-04
  • 打赏
  • 举报
回复
还是不理解啊。。
w拿了可热 2020-02-29
  • 打赏
  • 举报
回复
不懂啊?求详解。
jiangyongbing008 2019-10-01
  • 打赏
  • 举报
回复
没看这个代码,但是想了一下,可以这样解决。到达x,y左边的前一步,肯定是(x-3,y+2),(x-2,y+3),(x+3,y+2),(x+2,y+3),(x-3,y-2),(x-2,y-3),(x+3,y-2),(x+2,y-2)这几个点中,如果这几个点在有等于初始坐标的,直接返回,否则接着对这几个坐标同样的发散,等于就退出
Promomo 2019-09-27
  • 打赏
  • 举报
回复
学习一下代码,感谢分享
qq_40218831 2019-09-27
  • 打赏
  • 举报
回复
大佬 真大佬
michaelqiang7898 2019-09-27
  • 打赏
  • 举报
回复
不错啊,这样的代码
weixin_43311811 2019-09-27
  • 打赏
  • 举报
回复
学习了,虽然看不懂写的什么
流年里一过客 2019-09-27
  • 打赏
  • 举报
回复
我是来学习的,感谢分享
qq_45691479 2019-09-26
  • 打赏
  • 举报
回复
学习了,虽然看不懂写的什么
吉泉 2019-09-26
  • 打赏
  • 举报
回复
有点意思,学习看看!
qq_39936465 2019-09-25
  • 打赏
  • 举报
回复
以下是个人一点见解该段程序应该是用数学分析法。

因为镜像关系我们只要考虑第一象限,我们通过x=y把第一象限1分为2,第一象限关于x=y是对称的,所以我们只要分析0<y<x这个1/4象限。
设步数为n,终点为(x,y)

x=x(1)+x(2)+。。。+x(n);
y=y(1)+y(2)+。。。+y(n);

然后再从0<y<x/2 , x/2<y<x;2段分析。
当0<y<x/2时
当x为偶数 x(1)=x(2)=...=x(n)=2 n取得最小值x/2,
当x为奇数 x(1)=x(2)=...=x(n-1)=2,x(n)=1 n取得最小值x/2,
此时y向增量在2,1或-1,2之间。
然后根据x的奇偶性,y的奇偶性,n奇偶性 来分析 y=y(1)+y(2)+。。。+y(n)这个等式能否成立。
得出0<y<x/2时 n在 x/2<=n<=x/2+1之间 ,是否加1 取决于x,y,n的奇偶性
要分析要写很多,就不详细写了

这里第一行代码先求0<y<x/2时,n可能的最小值(注:程序考虑的是整个第一象限,第一象限 通过x=y对称的)
long step = Math.max((r + 1) / 2, (c + 1) / 2);
第2行代码 当x>y时 当0<y<x/2 x/2 大于(x+y)/3, 当x/2<y<x时反之, 因为对称关系当y>x时上述也成立,
step = Math.max(step, (r + c + 2) / 3)
第3行代码 不管 y是否大于x/2 这里都要根据n,x,y的奇偶规律 判断是否加1
step += (step ^ r ^ c) & 1;
我觉得第一名应该是看过这类数学分析法的文章
qq_39936465 2019-09-25
  • 打赏
  • 举报
回复
引用 19 楼 wowpH 的回复:
[quote=引用 17 楼 qq_39936465 的回复:] 分界线在y=x/2 和x=y/2 0<x<=y/2或0<y<=x/2 取图1部分,y/2<x<=y或x/2<y<=x取图2部分 然后奇偶修正。 图3为最后结果图
现在算是明白三行代码是什么意思了。。。不过感觉想到这个是太难了。。。顶多是像11楼提供的链接的那种题解那样列个表达式,代入求解。而不是这种计算(不需要判断的。) [/quote] 所以还是要多看数学算法书,有可用的数学公式程序能优化很多。
wowpH 2019-09-25
  • 打赏
  • 举报
回复
引用 17 楼 qq_39936465 的回复:
分界线在y=x/2 和x=y/2 0<x<=y/2或0<y<=x/2 取图1部分,y/2<x<=y或x/2<y<=x取图2部分 然后奇偶修正。 图3为最后结果图
现在算是明白三行代码是什么意思了。。。不过感觉想到这个是太难了。。。顶多是像11楼提供的链接的那种题解那样列个表达式,代入求解。而不是这种计算(不需要判断的。)
wowpH 2019-09-25
  • 打赏
  • 举报
回复
引用 15 楼 wowpH 的回复:
画了半天图,三行代码得到下面三个图。
图二的(1,1)位置值应该为 1。写错了。
qq_39936465 2019-09-25
  • 打赏
  • 举报
回复
引用 15 楼 wowpH 的回复:
画了半天图,三行代码得到下面三个图。
分界线在y=x/2 和x=y/2 0<x<=y/2或0<y<=x/2 取图1部分,y/2<x<=y或x/2<y<=x取图2部分 然后奇偶修正。 图3为最后结果图
wowpH 2019-09-25
  • 打赏
  • 举报
回复
引用 11 楼 射手座cl 的回复:
https://leetcode-cn.com/circle/article/nrRLra/ 不是有解析吗
谢谢,又多了种思路。
wowpH 2019-09-25
  • 打赏
  • 举报
回复
画了半天图,三行代码得到下面三个图。
wowpH 2019-09-24
  • 打赏
  • 举报
回复
引用 5 楼 NorZ 的回复:
这位操作真骚
这大概就是大佬吧。
wowpH 2019-09-24
  • 打赏
  • 举报
回复
引用 4 楼 天亮后说晚安 的回复:
我想不出来。我太南南南南了。
wowpH 2019-09-24
  • 打赏
  • 举报
回复
引用 3 楼 oh_Maxy 的回复:
感觉自己的脑子生锈了。。
谢谢老大推荐。50分预定。 所以我要多写写。不然锈的更快。
加载更多回复(7)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧