【努力刷力扣】第三十一天 --- 力扣461+1480(动态规划)
引言
本人初次尝试写博客,希望各位看官大佬多多包容
有错误希望巨巨们提出来,我一定会及时改正,谢谢大家
在自己最好的年纪,找到了未来的目标
还有1年奋斗刷题,明年去面试实习,加油!
博主最近要参加竞赛,所以暂时调整训练计划。
题目一要求:
整体思路:
切记:不可以每算一个数,就从头加到目标!
思路很简单,每一个新的值都是之前的结果加上本位置的值。
具体代码(内附注释)
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
for (int i = 1; i < nums.size(); i++) {
nums[i] = nums[i - 1] + nums[i];
}
return nums;
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):
题目二要求
汉明距离广泛应用于多个领域。在编码理论中用于错误检测,在信息论中量化字符串之间的差异。
两个整数之间的汉明距离是对应位置上数字不同的位数。
必备知识
体现两个二进制数的差别位,就用异或操作!
我们统计不一样的总共几位,,一样的置零,不一样的置一,这是异或操作。异或结束之后我们统计1的个数就完了,1的个数就代表了多少位差异。
解法一:暴力破解
完全就是一位一位算二进制位,然后进行比较
最最傻瓜的算法
class Solution {
public:
int hammingDistance(int x, int y) {
int nums = 0;
while (x != 0 || y != 0) {//x,y 全都为零,即可退出
int one = x % 2;
int two = y % 2;//取当前位
x >>= 1;
y >>= 1;
if (one != two) {
nums++;
}
}
return nums;
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):
调用系统库函数
1、c++/c __builtin_popcount(x) 前提:必须是g++编译器,因为这个是g++自带函数。
2、JAVA Integer.bitCount(x)
3、Golong bits.OnesCount(uint(x))
class Solution {//使用内置函数
public:
int hammingDistance(int x, int y) {
//我们统计不一样的总共几位,,一样的置零,不一样的置一,这是异或操作
//异或结束之后我们统计1的个数就完了,1代表的是不同的位数,用内置函数
return __builtin_popcount(x^y);
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):
时间复杂度:O(1)。不同语言的实现方法不一,我们可以近似认为其时间复杂度为 O(1)。
统计异或操作后1的个数
根据前序知识可知,仅仅统计1的个数即可。
第一:我每次统计过后,不希望他在影响我,所以右移1位,干掉他
第二:我看他末尾是零,则不是目标,是一,就是目标,所以按位与1(十进制),只保留最后一位原来的样子
class Solution {//尤其是这种二进制操作的问题,一定一定要尽量采用移位操作
public:
//异或操作,就是突出两个二进制数差异的操作,有差异为一,反之为零
int hammingDistance(int x, int y) {
int z = x ^ y, num = 0;
while (z) {
//我们每次都只需要看z的最后一位是不是一就行,所以在二进制操作中,只保留最后一位,所以按位与1
num += z & 1;
//因为每次是除,所以右移
z >>= 1;
}
return num;
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):
时间复杂度:O(logC),其中 CC 是元素的数据范围,在本题中 log C=log 2^{31} = 31
方法三的优化
利用算法:记 f(x 表示 xx 和 x-1x−1 进行与运算所得的结果(即 f(x)=x&(x-1)),那么 f(x)恰为 x 删去其二进制表示中最右侧的 1 的结果。所以就只需要重复执行上述操作直到目标到0为止,统计做了多少次就行,优化之处在于不用管两个相邻的“1”之间的零,直接可以跨过去,几个1 ,循环几次。
class Solution {//尤其是这种二进制操作的问题,一定一定要尽量采用移位操作
public:
int hammingDistance(int x, int y) {
//第一步取异或不变,突出差异处
int z = x ^ y, num = 0;
while (z) {
z &= z - 1;
num++;
}
return num;
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):
时间复杂度:O(logC),其中 CC 是元素的数据范围,在本题中 log C=log 2^{31} = 31