每周记录23/11/12

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)。

 2.169. 多数元素 - 力扣(LeetCode)

给定一个大小为 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)。

总结:多学点数据类型,多学点算法吧!!早晚被淘汰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值