算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组
1.x的平方根
java
(1)直接使用函数
class Solution {
public int mySqrt(int x) {
int rs = 0;
rs = (int)Math.sqrt(x);
return rs;
}
}
(2)二分法
对于一个非负数n,它的平方根不会小于大于(n/2+1)。
在[0, n/2+1]这个范围内可以进行二分搜索,求出n的平方根。
class Solution {
public int mySqrt(int x) {
long left=1,right=x;
while(left<right){
long mid = left+(right-left)/2;
long sq = mid*mid;
if(sq==x){
return (int)mid;
}else if(sq<x){
left = mid+1;
}else{
right = mid-1;
}
}
if(left*left>x){
left--;
}
return (int)left;
}
}
(3)牛顿迭代法
牛顿法是一种在实数域和复数域上近似求解方程的方法。
方法使用函数 f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。

选择一个接近函数f(x)零点的x0,计算相应的f(x0)和切线斜率f'(x0)(这里f'表示函数f的导数)。
也就是求如下方程的解:
将新求得的点 x坐标命名为x1,通常x1会比x0更接近方程f(x)=0的解。因此可以利用x1开始下一轮迭代。
迭代公式可化简为如下所示:
xn+1 = xn -(xn2 - a) / (2xn) = (xn+ a/xn) / 2
class Solution {
public int mySqrt(int x) {
if(x==0) return 0;
double last = 0;
double res = 1;
while(res!=last){
last = res;
res =(res+x/res)/2;
}
return (int)res;
}
}
php
class Solution {
/**
* @param Integer $x
* @return Integer
*/
function mySqrt($x) {
$rs = sqrt($x);
return floor($rs);
}
}
2.爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶 示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
斐波那契数列:
设跳n个台阶有f(n)种方法,
爬1个:1种
爬2个:2种
爬n个:面临两种选择:
(1) 第一次爬1个,此时剩余n-1个台阶,有f(n-1)种方法
(2) 第一次爬2个,此时剩余n-2个台阶,有f(n-2)种方法
所以f(n) = f(n-1) + f(n-2)
java
class Solution {
public int climbStairs(int n) {
if(n<=2) return n;
int num1 = 1;
int num2 = 2;
int numN = 0;
for(int i =2;i<n;i++){
numN = num1+num2;
num1 = num2;
num2 = numN;
}
return numN;
}
}
php
class Solution {
/**
* @param Integer $n
* @return Integer
*/
function climbStairs($n) {
if($n<=2) return $n;
$num1=1;
$num2=2;
$numN = 0;
for($i=2;$i<$n;$i++){
$numN = $num1+$num2;
$num1 = $num2;
$num2 = $numN;
}
return $numN;
}
}
3.删除排序链表中的重复元素
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) { if(head==null||head.next==null) return head;
ListNode res = head;
ListNode cur = head;
ListNode next = head.next;
while(next!=null){
if(next.val==cur.val){
cur.next = null;
}else{
cur.next = next;
cur = next;
}
next = next.next;
}
return res;
}
}
php
/**
* Definition for a singly-linked list.
* class ListNode {
* public $val = 0;
* public $next = null;
* function __construct($val) { $this->val = $val; }
* }
*/
class Solution { /**
* @param ListNode $head
* @return ListNode
*/
function deleteDuplicates($head) {
if($head==null||$head->next==null) return $head;
$res = $head;
$cur = $head;
$next = $head->next;
while($next){
if($cur->val!=$next->val){
$cur->next = $next;
$cur = $next;
}else{
$cur->next = null;
}
$next = $next->next;
}
return $res;
}
}
4.合并两个有序数组
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6]
java
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(n==0) return;
int len = m+n-1;
while(m>0&&n>0){
if(nums1[m-1]>nums2[n-1]){
nums1[len--] = nums1[m-1];
m--;
}else{
nums1[len--] = nums2[n-1];
n--;
}
}
if(m==0){
for(int i = 0;i<n;i++){
nums1[i] = nums2[i];
}
}
}
}
php
class Solution {
/**
* @param Integer[] $nums1
* @param Integer $m
* @param Integer[] $nums2
* @param Integer $n
* @return NULL
*/
function merge(&$nums1, $m, $nums2, $n) {
$len = $m+$n-1;
if($n==0) return;
while($m>0&&$n>0){
if($nums1[$m-1]>$nums2[$n-1]){
$nums1[$len--] = $nums1[$m-1];
$m--;
}else{
$nums1[$len--] = $nums2[$n-1];
$n--;
}
}
if($m>=0){
for($i = 0;$i<$n;$i++){
$nums1[$i] = $nums2[$i];
}
}
}
}
算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组的更多相关文章
- java合并两个有序数组的算法(抛砖引玉)
前几天看见一道面试题中要将两个有序数组合并成一个新的有序数组,首先使用了嵌套循环,之后想那样效率太低,又想出了以下思路,和大家分享下,如果有更好的方法,请留言指教: 思路: 1.新建一个数组大小为fi ...
- 萌新笔记——Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)
最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对"基数"以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了"HyperLo ...
- 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...
- 合并K个有序数组(链表)【字节跳动面试算法题】
本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...
- Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)
最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对“基数”以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了“HyperLogLog”,从而引出了Card ...
- LeetCode初级算法--链表02:合并两个有序链表
LeetCode初级算法--链表02:合并两个有序链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
- python经典算法题目:找出这两个有序数组的中位数
题目:找出这两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以 ...
- 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串
最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...
- PHP算法之寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
随机推荐
- python正则表达式练习题
# coding=utf-8 import re # 1. 写一个正则表达式,使其能同时识别下面所有的字符串:'bat','bit', 'but', 'hat', 'hit', 'hut' s =&q ...
- 微信小程序~用户转发 onShareAppMessage
只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮,在用户点击转发按钮的时候会调用,此事件需要return一个Object,包含title和path两个字段,用于自定义转发内容 代码使用onSh ...
- springboot的第一节课
快速开始spring boot应用 官方向导搭建boot应用 地址:http://start.spring.io/ 设置项目属性: 3.解压,拷贝到工作空间,导入maven项目 4.写Controll ...
- python SQLAlchemy的简单配置和查询
背景: 今天小鱼从0开始配置了下 SQLAlchemy 的连接方式,并查询到了结果,记录下来 需要操作四个地方 1. config ------数据库地址 2.init ----- 数据库初始化 3 ...
- java构建简单的HTTP服务器
使用Java技术构建Web应用时, 我们通常离不开tomcat和jetty之类的servlet容器,这些Web服务器功能强大,性能强劲,深受欢迎,是运行大型Web应用的必备神器. 虽然Java的设计初 ...
- C++定义和初始化数组以及memset的使用(转)
一.一维数组 静态 int array[100]; 定义了数组array,并未对数组进行初始化 静态 int array[100] = {1,2}: 定义并初始化了数组array 动态 int* ar ...
- JavaScript基础07——BOM
BOM概念 BOM是Browser Object Model的缩写,简称浏览器对象模型.这个对象就是window BOM提供了独立于内容而与浏览器窗口进行交互的对象 ...
- scylladb docker-compose 用户密码认证配置
scylladb 对于用户的认证配置还是比较简单的,以下是一个docker-compose 配置的说明 环境准备 docker-compose 文件 version: "3" se ...
- 浏览器端使用less
一.思路 ①less无法在浏览器中直接使用,浏览器不能识别 ②通过less解析插件less.js(JavaScript插件)可以把less文件解析成css代码(下载地址) 二.具体应用 ①less.j ...
- 解决js加减乘除精度问题
// 加法 const accAdd = (arg1, arg2) => { var r1, r2, m; try { r1 = arg1.toString(). ...