Leetcode--easy系列9
#198 House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it
will automatically contact the police if two adjacent houses were broken into on the same night.
Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.
去掉故事背景就是说,一个含有n个元素的数组(元素值当然大于0),从中取出m个位置的元素,要求相邻两个位置的元素最多仅仅能取一个。
求能获得元素值和的最大值
典型的DP问题。
自顶向下分析问题。n个元素的数组取和的最大值 f(n) ,能够转换为
max{ f(n-1) , f(n-2)+nums[n] }
利用数组a[n]保存中间子问题结果,算法例如以下:
注:依据故事背景。一条街上的住户不超过1000家吧。。。
//0ms
int rob(int* nums, int numsSize) {
int i=0,t1,t2;
int a[1000]={0};
if(numsSize==1)
{
a[0] = nums[0];
return a[0];
}
if(numsSize==2)
{
a[1] = (nums[0]>=nums[1]) ? nums[0]:nums[1];
return a[1];
}
if(numsSize==3)
{
if(nums[0]+nums[2]>=nums[1])
a[3] = nums[0]+nums[2];
else
a[3] = nums[1];
return a[3];
}
if(numsSize>3)
{
a[0] = nums[0];
a[1] = (nums[0]>=nums[1]) ? nums[0]:nums[1];
if(nums[0]+nums[2]>=nums[1])
a[2] = nums[0]+nums[2];
else
a[2] = nums[1]; for(i=3;i<numsSize;i++)
{
//t1 = rob(nums,numsSize-1);
//t2 = rob(nums,numsSize-2)+nums[numsSize-1];
t1 = a[i-1];
t2 = a[i-2]+nums[i];
a[i] = (t1>=t2)? t1:t2;
}
}
return a[numsSize-1];
}
# 202 Happy Number
Write an algorithm to determine if a number is "happy".
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle
which does not include 1. Those numbers for which this process ends in 1 are happy numbers.
Example: 19 is a happy number
- 12 + 92 = 82
- 82 + 22 = 68
- 62 + 82 = 100
- 12 + 02 + 02 =
1
Happy Number 指的是数n的每一位的平方和能通过经过有限次循环后和为 1
仅仅要出现循环就不是Happy Number
对于int型(10位)每一位平方和 小于: 9^2 * 10 = 810 ;能够用一个数组保存和 ,当再次出现该值时说明出现了一个循环,返回false
//0ms
bool isHappy(int n) {
int hash[810]={0};
int i=1,new_n=0;
if(n==1)
return true;
while(n!=1)
{
new_n = 0;
while(n)
{
new_n += (n%10)*(n%10);
n = n/10;
}
n = new_n; if(n==1)
return true; if(hash[n]==1)
return false;
else
hash[n] = 1;
}
}
基于事实1 是 Happy Number 而 2,3,4,5,6均不是Happy Number 为了使空间复杂度变为为O(1),可採用例如以下算法
//0ms
bool isHappy(int n)
{
int next;
while(n > 6)
{
next = 0;
while(n)
{
next += (n%10) * (n%10);
n /= 10;
}
n = next;
}
return n == 1;
}
#203 Remove Linked List Elements
Remove all elements from a linked list of integers that have value val.
Example
Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
Return: 1 --> 2 --> 3 --> 4 --> 5
<span style="font-size:10px;">//12ms
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode *newhead,*p,*q;
if(!head)
return NULL;
newhead->next = head; //简化代码,加入头结点 q p
q = newhead;
p = head;
while(p)
{
if(p->val==val)
q->next = p->next;//q 不变 p后移
else
q = p;// q p 都后移
p = p->next;
}
return newhead->next;
}</span>
#204 Count Primes
Count
the number of prime numbers less than a non-negative number, n.
求1~n-1之间素数的个数,注意1不是素数
推断 n 是一个素数的方法是,不能被
2 ~ sqrt(n) 之间的数整除。即约数仅仅有1和其本身
在Leetcode Discuss中看到例如以下解法:时间和空间复杂度都接近O(n)
https://leetcode.com/discuss/34622/my-c-solutions-in-44ms-time-nearly-o-n-and-space-nearly-o-n

//44ms
/*1. trick1 is to use square root of n.
2. trick2 is not to use non-prime numbers as the step
3. trick3 is to use i*i as the start.
4. trick4 is to use count-- in every loop, avoiding another traversal. */
int countPrimes(int n) {
if(n <= 2) return 0;
if(n == 3) return 1;
bool *prime= (bool*)malloc(sizeof(bool)*n);
int i=0,j=0;
int count = n-2;
int rt = sqrt(n);//trick1
for(j = 0; j < n; j++)
{
prime[j] = 1;
}
for(i = 2; i <= rt; i++)
{
if (prime[i])//trick2
{
for(j=i*i ; j<n ; j+=i)//trick3
{
if (prime[j])
{
prime[j]=0;
count--;//trick4
}
}
}
}
free(prime);
return count;
}
Leetcode--easy系列9的更多相关文章
- hdu 2049 不easy系列之(4)——考新郎
不easy系列之(4)--考新郎 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- LeetCode——single-number系列
LeetCode--single-number系列 Question 1 Given an array of integers, every element appears twice except ...
- HDU 2045不easy系列之三LELE的RPG难题(趋向于DP的递推)
不easy系列之(3)-- LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- hdu1465不easy系列之中的一个(错排)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/37512659 转载请注明出 ...
- Leetcode算法系列(链表)之删除链表倒数第N个节点
Leetcode算法系列(链表)之删除链表倒数第N个节点 难度:中等给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点.示例:给定一个链表: 1->2->3->4-&g ...
- Leetcode算法系列(链表)之两数相加
Leetcode算法系列(链表)之两数相加 难度:中等给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将 ...
- leetcode easy problem set
*勿以浮沙筑高台* 持续更新........ 题目网址:https://leetcode.com/problemset/all/?difficulty=Easy 1. Two Sum [4m ...
- [Leetcode] Sum 系列
Sum 系列题解 Two Sum题解 题目来源:https://leetcode.com/problems/two-sum/description/ Description Given an arra ...
- LeetCode 笔记系列16.3 Minimum Window Substring [从O(N*M), O(NlogM)到O(N),人生就是一场不停的战斗]
题目:Given a string S and a string T, find the minimum window in S which will contain all the characte ...
- 决战Leetcode: easy part(51-96)
本博客是个人原创的针对leetcode上的problem的解法,所有solution都基本通过了leetcode的官方Judging,个别未通过的例外情况会在相应部分作特别说明. 欢迎互相交流! em ...
随机推荐
- vue通过路由实现页面刷新
vue 开发微信商城项目,需求如下: 购物车页面跳转到详情页,购物车页面包含了多个组件,点击结算跳转到订单页面,从订单返回时,购物车页面没有刷新,由于购物车组件之间通过bus实现事件传递,页面跳转(非 ...
- 页面关闭或刷新时触发javascript的事件
当页面在关闭或刷新时提示 window.onbeforeunload(function(){ //判断是关闭还是刷新 1.满足关闭,否则是刷新 if(event.clientX>document ...
- 紫书 习题7-14 UVa 307(暴搜+剪枝)
这道题一开始我想的是在排序之后只在头和尾往中间靠近来找木块, 然后就WA, 事实证明这种方法是错误的. 然后参考了别人的博客.发现别人是直接暴搜, 但是加了很多剪枝, 所以不会超时. 我也想过这个做法 ...
- 题解 P3377 【【模板】左偏树(可并堆)】
所谓的左偏树,是一种可并堆的实现. 这种数据结构能够支持高效的堆合并,但是不支持查询节点等操作,因此不同于平衡树,它的结构是不平衡的. 左偏树满足如下两条基本性质: 1. 堆的性质 这也就是说左偏树每 ...
- POJ 1721
好像不需要用到开方什么的... 可以知道,一副牌即是一个循环,那么,由于GCD(L,K)=1,所以一次洗牌后,亦是一个循环.其实,K次洗牌等于是T^(2^K)了.既然是循环,必定有周期.那么,周期是多 ...
- DataTables warning: table id=dataTable - Requested unknown parameter 'acceptId' for row 0. For more
重点内容 DataTables warning: table id=dataTable - Requested unknown parameter 'acceptId' for row 0. For ...
- ORA 12505 Listener does not currently know of SID given in connection descriptor
oracle数据库正常启动后.在本地能够正常訪问,可是远程使用sqldevelop却不能訪问.提示ORA 12505 Listener does not currently know of SID g ...
- 计算机网络 4.网络层与IP协议
网络中的每一台主机和路由器都有一个网络层部分.而路由器中也没有网络层以上的层次.网络层是协议栈中最复杂的层次. 转发forwarding:当一个分组到达某路由器的输入链路时.该路由器将分组移动到适当的 ...
- 为QML创建C++插件(下载)
版权声明:本文为博主原创文章,欢迎转载,转载请注明出处 https://blog.csdn.net/MatchYang/article/details/54564462 1. 为QML创建C++插件的 ...
- JAVA设计模式之【迭代器模式】
迭代器模式 聚合类,聚合对象 电视机遥控器,迭代器,遍历局和对象中的成员 灵活新增遍历方法 将负责遍历数据的方法提取出来,封装到专门的类中,实现数据存储和数据遍历分离.这就是迭代器模式. 灵活性,可扩 ...