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/ ...
随机推荐
- C语言小程序(一)、判断三角型类型
最近回炉重造C语言,陆续写一些比较短的代码,选择其中的一些贴到这里,都是在Linux下的代码,Windows未测试. 第一个判断三角形的类型,两个浮点型数据不能直接判断相等,为了输入方便一些,自己设置 ...
- OpenCV - Windows(win10)编译opencv + opencv_contrib
在之前的几篇文章中,我提到了在Android.Linux中编译opencv + opencv_contrib,这篇文章主要讲在Windows中编译opencv + opencv_contrib. 首先 ...
- django TimedRotatingFileHandler log
15.9.6. TimedRotatingFileHandler¶ The TimedRotatingFileHandler class, located in the logging.handler ...
- HDOJ(1018)
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- yum软件包管理器
Yum (Yellow dog Updater, Modified) 黄狗升级器是一个在 Fedora 中的字符前端软件包管理器.基于 RPM 包管理(介绍见RPM包及其管理),能够从指定的服务器自动 ...
- Python-通过socket实现一个小型的端口检测工具
实验机器IP:192.168.220.139,端口开放情况 代码 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import ...
- Python命令模块argparse学习笔记(三)
参数组 ArgumentParser.add_argument_group(title=None, description=None) 默认情况下,当显示帮助消息时,ArgumentParser将命令 ...
- ansible一键部署LAMP
一.实现ansible跟节点间无密码访问,不会配置的请看 文章 . 二.创建目录 $ mkdir -p playbooks/{files,templates} 三.创建php测试文件index.p ...
- ssh的两种连接方法(包括无密码访问)
一.正常连接方法:ssh root@10.0.0.20 二.无密码连接方法(有两台机器:此处我把被连接的称为服务器,另一台则称为客户端): 1.先在服务器添加目录 .ssh: mkdir .ssh ...
- HDU 5971 Wrestling Match (二分图)
题意:给定n个人的两两比赛,每个人要么是good 要么是bad,现在问你能不能唯一确定并且是合理的. 析:其实就是一个二分图染色,如果产生矛盾了就是不能,否则就是可以的. 代码如下: #pragma ...