C#刷遍Leetcode面试题系列连载(4): No.633 - 平方数之和

点击蓝字“dotNET匠人”关注我哟

加个“星标”,每日 7:15,好文必达!

640?

前文传送门:

上篇文章中一道数学问题 - 自除数,今天我们接着分析 LeetCode 中的另一道数学题吧~

640?wx_fmt=png

今天要给大家分析的面试题是 LeetCode 上第 633 号问题,

Leetcode 633 - 平方数之和

https://leetcode.com/problems/sum-of-square-numbers/

题目描述

给定一个非负整数c ,你要判断是否存在两个整数a和 b,使得640?wx_fmt=png

示例1:

输入: 5	
输出: True	
解释: 1* 1+ 2* 2= 5

示例2:

输入: 3	
输出: False

Input:

5	
2	
100

Expected answer:

true	
true	
true

  • 题目难度: 简单

  • 贡献者:Stomach_ache

相关话题

  • 数学

    https://leetcode-cn.com/tag/math

相似题目

  • 有效的完全平方数

    https://leetcode-cn.com/problems/valid-perfect-square


解题思路:

方法1: 遍历

做一次循环,用目标和减去循环变量的平方,如果剩下的部分依然是完全平方的情形存在,就返回true;否则返回false。

假定640?wx_fmt=png,根据数据的对称性,循环变量 i 只需取到 640?wx_fmt=png 即可覆盖所有情形.

时间复杂度: O(n)

方法2: 双指针法

左指针 l=0,右指针 r = √C,夹逼条件是 ll + rr = C

感谢 博客园园友 msp的昌伟哥哥 的补充和指正~

时间复杂度: log(n)

方法1 已AC代码:

最初版本:

public class Solution	
{	public bool JudgeSquareSum(int c)	{           	for (int i = 0; c - 2 * i * i >= 0; i++)	{	double diff = c - i*i;	// 若向上取整=向下取整,则该数开方后是整数	if ((int)(Math.Ceiling(Math.Sqrt(diff))) == (int)(Math.Floor(Math.Sqrt(diff))))             	return true;	}	return false;	}	
}

Rank:

执行用时: 56ms, 在所有 csharp 提交中击败了 68.18%的用户.

优化1:

public class Solution	
{	public bool JudgeSquareSum(int c)	{           	for (int i = 0; c - 2 * i * i >= 0; i++)	{	int diff = c - i*i;	if (IsPerfectSquare(diff))	return true;	}	return false;	}	private bool IsPerfectSquare(int num)	{	double sq1 = Math.Sqrt(num);	int sq2 = (int)Math.Sqrt(num);	if (Math.Abs(sq1 - (double)sq2) < 10e-10)	return true;	return false;	}	
}

Rank:

执行用时: 52ms, 在所有 csharp 提交中击败了 90.91% 的用户.

优化2(根据文末参考资料[1]中MPUCoder 的回答改写,16进制下mod16减少比较次数):

public class Solution	
{	public bool JudgeSquareSum(int c)	{           	for (int i = 0; i <= c && c - i * i >= 0; i++)	{	int diff = c - i*i;	if (IsPerfectSquare(diff))	return true;	}	return false;	}	public bool IsPerfectSquare(int num)	{	//TRUE only if n mod 16 is 0,1,4,or 9	if ((0x0213 & (1 << (num & 15))) != 0)  	{	int t = (int)Math.Floor(Math.Sqrt((double)num) + 0.5);	return t * t == num;	}	return false;	}	
}

Rank:

执行用时: 44ms, 在所有 csharp 提交中击败了 100.00% 的用户.

640?wx_fmt=png

优化3(根据文末参考资料[1]中 Simon 的回答改写):

public class Solution	
{	public bool JudgeSquareSum(int c)	{           	for (int i = 0; c - i * i >= 0; i++)	{	long diff = c - i*i;	if (IsSquareFast(diff))	return true;	}	return false;	}	bool IsSquareFast(long n)	{	if ((0x2030213 & (1 << (int)(n & 31))) > 0)	{	long t = (long)Math.Round(Math.Sqrt((double)n));	bool result = t * t == n;	return result;	}	return false;	}	
}

Rank:

执行用时: 48ms, 在所有 csharp 提交中击败了 100.00%的用户.

方法2 已AC代码:

    public class Solution	{	public bool JudgeSquareSum(int c)	{	var r = (int)Math.Sqrt(c);	var l = 0;	while (l <= r)	{	var sum = l * l + r * r;	if (sum == c)	return true;	if (sum < c)	l++;	else	r--;	}	return false;	}	// 以下为测试	public static void Main(string[] args)	{	var sol = new Solution();	var res = sol.JudgeSquareSum(25);	Console.WriteLine(res);	}	}

Rank: 

执行用时: 40ms, 在所有 csharp 提交中击败了 100.00% 的用户.

相比较而已,双指针法确实更快一些~

相应代码已经上传到github:

https://github.com/yanglr/Leetcode-CSharp/tree/master/leetcode633

参考资料:

[1] Fast way to test whether a number is a square

https://www.johndcook.com/blog/2008/11/17/fast-way-to-test-whether-a-number-is-a-square/

[2] Shortest way to check perfect Square? - C#

https://stackoverflow.com/questions/4885925/shortest-way-to-check-perfect-square/4886006#4886006

End


作者简介:Bravo Yeung计算机硕士,知乎干货答主(获81K 赞同, 37K 感谢, 234K 收藏)。曾在国内 Top3互联网视频直播公司工作过,后加入一家外企做软件开发至今。

欢迎各位读者加入 .NET技术交流群,在公众号后台回复“加群”或者“学习”即可。

640?wx_fmt=gif


640?wx_fmt=jpeg


朕已阅 640?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁

菜菜哥&#xff0c;告诉你一个消息你有男票啦&#xff1f;非也非也&#xff0c;我昨天出去偷偷面试&#xff0c;结果又挂了哦&#xff0c;看来公司是真的不想让你走呀面试官让我说一下乐观锁和悲观锁&#xff0c;我没回答上来&#xff0c;回来之后我查了&#xff0c;数据库没有…

solverstate的使用

http://blog.csdn.net/wang4959520/article/details/51831637 我们在使用caffe训练过程中会生成.caffemodel和.solverstate文件&#xff0c;一个是模型文件&#xff0c;一个是中间状态文件&#xff08;生成多少个取决于你自己设定的snapshot&#xff09;。当训练过程中断&#…

IT从业者的迷思与求解之道——座谈会实录摘选

本次座谈会于上周六开始&#xff0c;由于网络原因&#xff0c;很多国内的小伙伴们没有能够连进去&#xff0c;挺遗憾的。所以我整理了本次座谈会的部分内容&#xff0c;希望能对大家有所帮助。洞察力主持人&#xff1a;大家好我们来自开源社群&#xff0c;今天举行在线it社区的…

准确率、召回率、F1、mAP、ROC、AUC

https://yongyuan-workbench.rhcloud.com/%E4%BF%A1%E6%81%AF%E6%A3%80%E7%B4%A2ir%E7%9A%84%E8%AF%84%E4%BB%B7%E6%8C%87%E6%A0%87%E4%BB%8B%E7%BB%8D-%E5%87%86%E7%A1%AE%E7%8E%87%E3%80%81%E5%8F%AC%E5%9B%9E%E7%8E%87%E3%80%81f1%E3%80%81map%E3%80%81r/准确率、召回率、F1…

从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用

标题&#xff1a;从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用。 作者&#xff1a;Lamond Lu 地址&#xff1a;https://www.cnblogs.com/lwqlun/p/11717254.html源代码&#xff1a;https://github.com/lamondlu/DynamicPlugins前景回顾•••••简介在前…

小波变换基础

http://blog.csdn.net/GarfieldEr007/article/details/50151845 第十二章 小波变换 目录 1 引言 2 连续小波变换 3 二进小波变换 3.1 Haar变换 4 离散小波变换 4.1 多分辨率分析 4.2 快速小波变换算法 4.3 离散小波变换的…

.Net Core3.0使用gRPC

gRPC是什么gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务&#xff0c;以实现负载平衡&#xff0c;跟踪&#xff0c;运行状况检查和身份验证。它也适用于分布式计算的最后一英里&#xff0c;以将设备&am…

单链表逆向

转自&#xff1a;http://blog.csdn.net/heyabo/article/details/7610732 对于单链表的逆置有两种方法可以实现&#xff1a; &#xff08;1&#xff09;利用辅助指针 基本思想&#xff1a;在遍历结点过程中&#xff0c;设置辅助指针&#xff0c;用于记录先前遍历的结点。这样依次…

中国.NET开发者峰会特别活动-基于k8s的微服务和CI/CD动手实践报名

2019.11.9 的中国.NET开发者峰会将在上海举办&#xff0c;到目前为止&#xff0c;大会的主题基本确定&#xff0c;这两天就会和大家会面&#xff0c;很多社区的同学基于对社区的信任在我们议题没有确定的情况下已经购票超过了300张&#xff0c;而且分享的主题都来自于社区&…

高斯混合模型学习

转自&#xff1a;http://blog.csdn.net/jojozhangju/article/details/19182013 1.高斯混合模型概述 高斯密度函数估计是一种参数化模型。高斯混合模型&#xff08;Gaussian Mixture Model, GMM&#xff09;是单一高斯概率密度函数的延伸&#xff0c;GMM能够平滑地近似任意形状的…

[工具]OFFICE插件管理工具-帮助更好地管理及使用电脑安装过的OFFICE插件

在OFFICE软件的世界中&#xff0c;除了由微软提供的OFFICE软件功能外&#xff0c;还有大量的功能由第三方开发者完成&#xff0c;市面上也存在大量的OFFICE插件供用户选择。使用场景有些插件仅在某个特定场景下才会使用&#xff0c;日常办公过程中&#xff0c;无需开启&#xf…

随机梯度下降的实现细节

http://www.miaoerduo.com/deep-learning/%E5%9F%BA%E4%BA%8Ecaffe%E7%9A%84deepid2%E5%AE%9E%E7%8E%B0%EF%BC%88%E4%B8%8A%EF%BC%89.html 最近看了一篇文章&#xff0c;详细说明了随机梯度下降中随机是在create_imagenet.sh中shuffle实现的。 相关资源&#xff1a; DeepID&am…

那位标榜技术驱动的开发者去哪了?

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区合伙人&#xff01;一他是一位曾经标榜技术驱动世界的开发者&#xff0c;在他年轻的时候&#xff0c;一段独特的经历&#xff0c;让他对技术充满了兴趣&#xff0c;并在技术这条道路上走了很远很…

图像PCA方法

http://blog.csdn.net/lifeng_math/article/details/50014073 http://blog.csdn.net/lifeng_math/article/details/49993763#旋转不变的-lbp 引言 PCA是Principal Component Analysis的缩写&#xff0c;也就是主成分分析。也是用于降维常用的一中方法。PCA 主要用于数据降维&a…

.NET实时2D渲染入门·动态时钟

前言说来这是个我和我老婆的爱情故事。从小以来“坦克大战”、“魂斗罗”等游戏总令我魂牵梦绕。这些游戏的基础就是 2D实时渲染&#xff0c;以前没意识&#xff0c;直到后来找到了 Direct2D。我的 2D实时渲染入门&#xff0c;是从这个 动态时钟开始的。本文将使用我写的“准游…

ASP.NET Core在 .NET Core 3.1 Preview 1中的更新

.NET Core 3.1 Preview 1现在可用。此版本主要侧重于错误修复&#xff0c;但同时也包含一些新功能。对Razor components的部分类支持将参数传递给顶级组件在HttpSysServer中支持共享队列在SameSite cookies的重大更改除了.NET Core 3.1 Preview版本发布之外&#xff0c;我们还发…

小波变换学习(1)

转自&#xff1a;https://www.zhihu.com/question/22864189/answer/40772083从傅里叶变换到小波变换&#xff0c;并不是一个完全抽象的东西&#xff0c;可以讲得很形象。小波变换有着明确的物理意义&#xff0c;如果我们从它的提出时所面对的问题看起&#xff0c;可以整理出非常…

.NET Core 3.0 新 JSON API - JsonDocument

JsonDocument类 JsonDocument是基于Utf8JsonReader 构建的。JsonDocument 可分析 JSON 数据并生成只读文档对象模型 (DOM)&#xff0c;可对模型进行查询&#xff0c;以支持随机访问和枚举。使用 JsonDocument 分析常规 JSON 有效负载并访问其所有成员比使用 Json.NET 快 2-3 倍…

微软推出 Microsoft.Data.SqlClient,替代 System.Data.SqlClient

背景在 .NET 创建之初&#xff0c;System.Data 框架是一个重要的组件。它为创建 .NET 数据库驱动程序提供了一种方式&#xff0c;类似 Visual Basic 的 ActiveX Data Objects。虽然 API 不一样&#xff0c;但重用了它的名称&#xff0c;所以才有了 ADO .NET 这个绰号。ADO 和 A…

C++ 从文件夹中读取文件

OpenCV从文件夹中读取内含文件方法 参考&#xff1a;http://www.2cto.com/kf/201407/316515.html http://www.it610.com/article/5126146.htm http://blog.csdn.net/adong76/article/details/39432467 windows平台代码&#xff1a; [cpp] view plaincopy #include <io.h&…