Leetcode初级算法(排序和搜索+数学篇)
合并两个有序数组
开始的时候将这道题理解错了,发现几个奇怪的测试案例后才明白这道题什么意思。本来的想法就是把nums2全部放到num1里面,然后删除重复元素、排序一下,就有了下面的代码:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int i=0;i<n;i++)
{
nums1.push_back(nums2[i]);
}
sort(nums1.begin(),nums1.end());
vector<int>::iterator iter = unique(nums1.begin(), nums1.end());
nums1.erase(iter, nums1.end());
}
};
后来发现测试案例是这样给的:[1,2,3,0,0,0] 3 [2,5,6] 3,测试的意思是nums1初始化为【1,2,3,0,0,0】,其中后面三个0是初始化自带的,是要将nums2的元素填充进去。既然这样,呢我们就索性就在原来错误的代码上进行修改吧,无非是只取nums1的前m个元素罢了,更改后的成功代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> nums(m,0);
for(int i=0;i<m;i++)
{
nums[i]=nums1[i];
}
for(int i=0;i<n;i++)
{
nums.push_back(nums2[i]);
}
sort(nums.begin(),nums.end());
nums1=nums;
}
};
但是这道题感觉自己还是走捷径做出来的,并没有实际上理解想考察哪一个知识点,所以看了大神的代码:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int end=m+n-1;
m--;n--;
while(m>=0&&n>=0)
{
if(nums2[n]>nums1[m])
{
nums1[end--]=nums2[n--];
}
else
{
nums1[end--]=nums1[m--];
}
}
while(n>=0)
{
nums1[end--]=nums2[n--];
}
}
};
更优一种解法是
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int count=m+n-1;
--m;--n;
while(m>=0 && n>=0) A[count--]=(A[m]>B[n]?A[m--]:B[n--]);
while(n>=0) A[count--]=B[n--];
}
};
第一个错误的版本
第一感觉是二分法,如果最中间的呢个版本出错了,说明错误版本肯定在之前;如果中间版本正确,说明错误版本在之后。所以写成以下代码:
// Forward declaration of isBadVersion API.
bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
if(n<=0) return 0;
int first=1,end=n;
while(first<=end){
int mid=(first+end)/2;
if(isBadVersion(mid))
end=mid-1;
else
first=mid+1;
}
return first;
}
};
但是却显示超时,后来发现可能是int mid=(first+end)/2;
这一行代码出现了问题,因为first+end可能会出现溢出错误,所以改成了一下代码:
// Forward declaration of isBadVersion API.
bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
if(n<=0) return 0;
int first=1,end=n;
while(first<=end){
int mid=first+(end-first)/2;
if(isBadVersion(mid))
end=mid-1;
else
first=mid+1;
}
return first;
}
};
直接就成功了。但是溢出错误却显示超出时间限制,是因为leetcode的代码检测是因为发现溢出没有继续执行导致超出时间限制还是其他原因就不知道了。。。但是通过这道简单的题,一定要了解first+(end-first)/2
与(end+first)/2
在表示上虽然相同,但是计算机计算的时候确实完全不同的!这一点在《C++ Primer》这本书P101的练习3.26上也有验证。
罗马数字转整数
首先了解一下罗马数字是什么;
字母 | M | D | C | L | X | V | I |
---|---|---|---|---|---|---|---|
代表数字 | 1000 | 500 | 100 | 50 | 10 | 5 | 1 |
还有一些具体的规则请见这篇博客
在这里先列举出来,因为对解题还是有帮助的:
1。相同的数字连写,所表示的数等于这些数字相加得到的数。如 XXX表示 30
2.小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数 如VIII 表示8
3.小的数字(限于I, X,C)在大的数字的左边, 所表示的数等于大数减去小的数: 如IV 表示4
4.在一个数的上面画一条横线,表示这个数增值1000倍
注意,并不是将罗马数字所代表的数字加起来就行了,而是需要遵守一定的规则,尤其是第三条。下面放上代码:
class Solution {
public:
int romanToInt(string s) {
unordered_map<char,int> m{{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};
int sum=0;
for(int i=0;i<s.size();i++)
{
int val=m[s[i]];
if(i==s.size()-1 || m[s[i+1]]<=m[s[i]]) sum+=val;
else
sum-=val;
}
return sum;
}
};
3的幂
最简单的就是写一个循环进行判断,所以我也这么干了。我的代码
class Solution {
public:
bool isPowerOfThree(int n) {
if(n==0) return false;
while(n%3==0)
{
n=n/3;
}
return n==1;
}
};
但是,题目的进阶要求是不使用循环或者递归,当时就比较懵圈,还能有这种操作?看了看大神的代码:
class Solution {
public:
bool isPowerOfThree(int n) {
return(n>0&&int(log10(n)/log10(3))-log10(n)/log10(3)==0);
}
};
用对数来判断是否是3的倍数,int(log10(n)/log10(3))-log10(n)/log10(3)==0
这行代码实在是太机智了,自愧不如自愧不如......
Leetcode初级算法(排序和搜索+数学篇)的更多相关文章
- LeetCode初级算法--排序和搜索01:第一个错误的版本
LeetCode初级算法--排序和搜索01:第一个错误的版本 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.cs ...
- LeetCode初级算法的Python实现--排序和搜索、设计问题、数学及其他
LeetCode初级算法的Python实现--排序和搜索.设计问题.数学及其他 1.排序和搜索 class Solution(object): # 合并两个有序数组 def merge(self, n ...
- LeetCode初级算法(数组)解答
这里记录了LeetCode初级算法中数组的一些题目: 加一 本来想先转成整数,加1后再转回去:耽美想到测试的例子考虑到了这个方法的笨重,所以int类型超了最大范围65536,导致程序出错. class ...
- 【LeetCode算法】LeetCode初级算法——字符串
在LeetCode初级算法的字符串专题中,共给出了九道题目,分别为:反转字符串,整数反转,字符串中的第一个唯一字符,有效的字母异位词,验证回文字符串,字符串转换整数,实现strStr(),报数,最 ...
- LeetCode初级算法--链表02:合并两个有序链表
LeetCode初级算法--链表02:合并两个有序链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
- LeetCode初级算法--数组01:只出现一次的数字
LeetCode初级算法--数组01:只出现一次的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
- LeetCode初级算法--数组02:旋转数组
LeetCode初级算法--数组02:旋转数组 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...
- LeetCode初级算法--字符串01:反转字符串
LeetCode初级算法--字符串01:反转字符串 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- LeetCode初级算法--链表01:反转链表
LeetCode初级算法--链表01:反转链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...
随机推荐
- Qt Create 4.6.2无法自动生成Android Kit
开发环境: OS,Microsoft Windows [Version 10.0.17134.523] Qt,5.11.1 Qt Creator,4.6.2 JDK,1.8.0_181 Android ...
- Agc011_C Squared Graph
传送门 题目大意 给定$n$个点$m$条边的简单图(无重边无自环),将有序点对$\{a,b\}$作为新的点,新产生的$n^2$个点中对于两个点,$\{a,b\},\{x,y\}$,当且仅当原图中存在边 ...
- TVYJ1266:费解的开关
我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:http://www.joyoi.cn/problem/tyvj-1266 这 ...
- selenium webdriver frame操作,跳进跳出
如果有两个平级的frame,跳进一个以后操作完成再操作第二个,这种情况要先跳出来,再跳进另外一个frame 跳出语句:browser.switch_to_default_content() #codi ...
- 使用cmd命令行方式登录ftp上传下载数据
部分用户在使用ftp工具登录空间上传下载过程中经常会遇到各种问题,如主动模式,被动模式,以及其他导致无法登陆ftp .上传数据.下载数据的问题,这时候不妨使用一下命令行方式.命令行下可以避免很多由于f ...
- HDOJ5441(图论中的并查集)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ; ; ...
- JAVA 1.5 并发之 ReentrantLock
在文章里我不打算具体讲Lock的实现,对此有兴趣的请点击这篇博文 http://www.blogjava.net/BucketLi/archive/2010/09/30/333471.html 我是一 ...
- 代码,用c++实现线性链表
#include <iostream> #include <stdio.h> #include <malloc.h> using namespace std; #d ...
- 使用SwingWorker为界面执行异步任务
------------------siwuxie095 工程名:TestSwingWorker 包名:com.siwuxie095.swing ...
- Flask12 数据库连接、创建数据库用户、注册模块
1 连接数据库 1.1 安装 flask-sqlalchemy flask-sqlalchemy 会让 sqlalchemy 使用起来更加方便 pip3 install flask-sqlalchem ...