算法题解之math类题
Bulb Switcher
灯泡开关
思路:除了平方数以外,其他所有位置的灯泡最终都被开关了偶数次,因此最终都为0。问题等价于求1~n中平方数的个数。
public class Solution {
public int bulbSwitch(int n) {
return (int)Math.sqrt(n);
}
}
Count Primes
质数计数
思路1:暴力法。其中判断每一个数n是不是质数需要验证是否任何小于n的数都不能整除n,这一步是O(n)。因此整体复杂度是O(n^2)。
思路2:思路1的优化版。如果一个数n不是质数,则n = p * q。令 p <= q,则可以推出 p * p <= n,即 p <= √n。因此思路一中只需要判断是否任何小于等于√n都不能整除n。整体时间复杂度变为O(n^1.5)。
public int countPrimes(int n) {
int count = 0;
for (int i = 1; i < n; i++) {
if (isPrime(i)) count++;
}
return count;
}
private boolean isPrime(int num) {
if (num <= 1) return false;
// Loop's ending condition is i * i <= num instead of i <= sqrt(num)
// to avoid repeatedly calling an expensive function sqrt().
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) return false;
}
return true;
}
思路3:埃拉托色尼筛选法:对于当前数i(i要从2开始),把它的倍数2i,3i,4i......都标记为不是质数,然后 i 的下一个没有被标记过的数一定是质数。
优化:(1)如果一个数已经被标记为不是质数了,直接跳过,因为它的倍数之前一定已经标记过了;(2)对于数i,不用从2i开始标记,直接从i * i开始标记(之前的也一定被标记过)。
算法空间复杂度为O(n),时间复杂度为O(n log log n)。(证明见wiki)
public class Solution {
public int countPrimes(int n) {
boolean[] notPrime = new boolean[n];
int count = 0;
for (int i = 2; i < n; i++) {
if (notPrime[i] == false) {
count++;
for (long j = i; i * j < n; j++) {
notPrime[(int)(i * j)] = true;
}
}
}
return count;
}
}
Insert Interval
插入区间
思路:区间类题目。先把区间按照start大小插入进去,然后就就跟排好序的merge intervals一样了。
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> res = new ArrayList<Interval>();
if (intervals == null || intervals.size() == 0) {
res.add(newInterval);
return res;
} for (int i = 0; i < intervals.size(); i++) {
if (intervals.get(i).start > newInterval.start) {
intervals.add(i, newInterval);
break;
} else if (i == intervals.size() - 1) {
intervals.add(newInterval);
break;
}
} res.add(intervals.get(0));
for (int i = 1; i < intervals.size(); i++) {
Interval cur = intervals.get(i);
Interval last = res.get(res.size() - 1);
if (cur.start <= last.end) {
last.end = Math.max(last.end, cur.end);
} else {
res.add(cur);
}
}
return res; }
}
Merge Intervals
合并区间
思路:区间类题目。先把所有区间按照start排好序,把第一个区间加到合并集中。然后遍历之后的每个区间,只需要与合并集中最后一个区间进行比较合并。
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public List<Interval> merge(List<Interval> intervals) { List<Interval> res = new ArrayList<Interval>(); if (intervals == null || intervals.size() == 0) {
return res;
} Comparator<Interval> c = new Comparator<Interval>() {
public int compare(Interval i1, Interval i2) {
return i1.start - i2.start;
}
};
Collections.sort(intervals, c);
res.add(intervals.get(0));
for (int i = 1; i < intervals.size(); i++) {
Interval cur = intervals.get(i);
Interval last = res.get(res.size() - 1);
if (cur.start <= last.end) {
last.end = Math.max(last.end, cur.end);
} else {
res.add(cur);
}
}
return res;
}
}
Power of Three
判断3的次方
思路1:循环或者递归。复杂度O(lgn)
思路2:题目规定不能用loop或者递归。可以调用java的log函数来做。时间仍然是O(lgn)
思路3:求出int中3的次方的最大值,判断max是否能被n整除。时间是O(1)。power of tow,power of four 均与这题类似。
public class Solution {
public boolean isPowerOfThree(int n) {
int Max3PowerInt = 1162261467;
if (n > 0 && n <= Max3PowerInt) {
if (Max3PowerInt % n == 0) {
return true;
}
}
return false;
}
}
Rectangle Area
矩形面积
思路:设矩形1的上下左右边分别为u1,d1,l1,r1,矩形2的上下左右边分别为u2,d2,l2,r2。则两矩形不相交的充要条件是:u1在d2下方 或 u2在d1下方 或 l1在r2右边 或 l2在r1右边。其余情况一定相交。相交面积的求法是:相交矩形的左边是l1和l2其中靠右的边,相交矩形的右边是r1和r2其中靠左的边,相交矩形的上边是u1和u2的靠下的边,相交矩形的下边是d1和d2的靠上的边。
public class Solution {
public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
int area1 = (C - A) * (D - B);
int area2 = (G - E) * (H - F);
if (A >= G || E >= C || B >= H || F >= D) {
return area1 + area2;
}
int w = Math.min(C, G) - Math.max(A, E);
int h = Math.min(D, H) - Math.max(B, F);
return area1 + area2 - w * h;
}
}
算法题解之math类题的更多相关文章
- 6.算法竞赛中的常用JAVA API :Math类(转载)
6.算法竞赛中的常用JAVA API :Math类 求最值 最小值 Math.min(int a, int b) Math.min(float a, float b) Math.min(double ...
- Math类和Random类(数学公式相关类)
Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数. 常用方法: 1.static 数值类型 abs(数值类型 a) 返回 double 值的绝对值. 2.sta ...
- Java开发知识之Java的数字处理类Math类
Java开发知识之Java的数字处理类Math类 一丶Java.text.DecimalFormat类与NumberFormat类 首先 Java.text.DecimalFormat指的是Decim ...
- JAVA Number与Math类
Number类: 当要用到数字的时候,我们除了使用内置数据类型byte,int,double等来声明,我们还把它声明为一个对象: 所有的包装类(Integer.Long.Byte.Double.Flo ...
- Java—Math类和随机数类
一.Math类(主要封装算数运算的静态方法) 定义: Math是没有构造方法的. java语言中提供了一个执行数学基本运算的Math类,Math类包括常用的数学运算和一些数学函数.还提供了一些常用的常 ...
- Java-Runoob:Java Number & Math 类
ylbtech-Java-Runoob:Java Number & Math 类 1.返回顶部 1. Java Number & Math 类 一般地,当需要使用数字的时候,我们通常使 ...
- 基本类型包装类、System类、Math类、Arrays类、大数据运算
1 基本类型包装类 Java中想对8种基本数据类型进行复杂操作很困难. 实际程序界面上用户输入的数据都是以字符串类型进行存储的. 程序开发中,需要把字符串转换成指定的基本数据类型. 1.1基本数据类型 ...
- Number 和 Math 类
Java Number & Math 类 一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等. 然而,在实际开发过程中,我们经常会遇到需要 ...
- [常用类]Number & Math 类(转载)
下面的表中列出的是 Number & Math 类常用的一些方法: 序号 方法与描述 1 xxxValue() 将 Number 对象转换为xxx数据类型的值并返回. 2 compareTo( ...
随机推荐
- Python学习笔记——文件写入和读取
1.文件写入 #coding:utf-8 #!/usr/bin/env python 'makeTextPyhton.py -- create text file' import os ls = os ...
- NAT穿透解决方案介绍
最近公司要实现在各种网络环境下面的多屏互动(机顶盒.android phone.iphone及PC端)的需求:由于IP地址资源有限的原因,目前我们使用的各种终端设备都位于局域网后面也就是多台设备共享同 ...
- .NET Reflector Visual Studio Extension
https://visualstudiogallery.msdn.microsoft.com/95789cdb-08f9-4dae-9b2f-fc45a452ad77/
- ecshop 订单编号 get_order_sn
文件地址include/lib_order.php ,要引用需要先导入 lib_order.php require_once(ROOT_PATH . 'includes/lib_order.php') ...
- 安装docker管理工具rancher
http://blog.csdn.net/freewebsys/article/details/51136562 docker(2):安装docker管理工具rancher rancher是一个Doc ...
- 为什么要使用class.forname在DriverManager.getConnection之前
JDBC在getConnection之前为什么要调用Class.forName 获取一个数据库连接的通用模板如下: String driver = "oracle.jdbc.OracleDr ...
- tamper绕WAF详解
0x00 背景 sqlmap中的tamper脚本来对目标进行更高效的攻击. 由于乌云知识库少了sqlmap-tamper 收集一下,方便学习. 根据sqlmap中的tamper脚本可以学习过绕过一些技 ...
- servlet的九大内置对象
隐式对象 说明 request 转译后对应HttpServletRequest/ServletRequest对象 response 转译后对应HttpServletRespons/ServletRes ...
- phpcms使用细节
1.在模板中使用php语句 <?php for ($i=0; $i < 10; $i++) { echo $i."#######<br>"; }?& ...
- mongodb 基本用法大全
1>给数据库添加用户名密码 db.addUser("xxx","yyy") 2>