1.x 的平方根 (Sqrt(x)) - 力扣 (LeetCode)
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
示例 1:
输入:x = 4 输出:2
示例 2:
输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 2^31 - 1
本题要求书写math.h函数sqrt(x),提示告诉我们输入类型是一个unsigned int,因此平方根用int完全够了。
小学就会的方法,从小到大找x这个数介于哪两个数的平方之间,其中比x小的那个数就是结果(其实就是估算的方式,不过这里舍去小数点后简化了估算的过程)。别的方法目前没想到,看看别人的吧。
int mySqrt(int n)
{
int sqr=0;
for (long i = 1; i <= n; i++)
{
if ((i * i) <= n)
sqr = i;
else
break;
}
return sqr;
}
用的方法比较蠢,时间复杂度o(n^(1/2)),空间复杂度o(1)。
给定一个大小为 n
的数组 nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3] 输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2] 输出:2
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
这个题还是比第一题重量级很多的啊,一上来就给我看傻眼了。后来知道其实这就是一种最简单算法的使用,好像也明白为什么这是简单题了。一开始肯定先是想遍历嘛,从前往后找每个数各有多少个,找到一个超过半数的为止。这样算是暴力破解,但是时间复杂度也到o(n^2)了。然后发现题目里有个时间复杂度限制,一看就是我不会的算法。这时我就想能不能建立多个指针,将不一样的数一一消去,但是没想通怎么写下去(不过这个思路和最终算法还是有点沾边了,就是比较蠢而已),最后还是观摩评论指点。
摩尔投票法,一种寻找众数的算法。以一个标准数和一个计数器为判断标准,与标准数相同计数器增加不同减少,减到零换一个标准数(其实就是抵消了前面的所有数),而众数又大于数组的二分之一,那么抵消之后就算是所有非众数都和众数抵消了,众数也至少留有一个。所以最后留下的标准数就是众数。
int majorityElement(int* nums, int numsSize)
{
unsigned short sign = 0;
int n = nums[0];
for (int i = 0; i < numsSize; i++)
{
if (nums[i] == n)
sign++;
else
sign--;
if (sign == 0)
{
n = nums[i];
sign=1;
}
}
return n;
}
完成题目要求即时间复杂度为 O(n),空间复杂度为 O(1)。
总结:多学点数据类型,多学点算法吧!!早晚被淘汰