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开始下一轮迭代。

迭代公式可化简为如下所示:

计算x2 = a的解,可以看成f(x) =x2  - a,a即为要求平方根

xn+1 = xn -(xn- 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的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组的更多相关文章

  1. java合并两个有序数组的算法(抛砖引玉)

    前几天看见一道面试题中要将两个有序数组合并成一个新的有序数组,首先使用了嵌套循环,之后想那样效率太低,又想出了以下思路,和大家分享下,如果有更好的方法,请留言指教: 思路: 1.新建一个数组大小为fi ...

  2. 萌新笔记——Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)

    最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对"基数"以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了"HyperLo ...

  3. 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays

    一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...

  4. 合并K个有序数组(链表)【字节跳动面试算法题】

    本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...

  5. Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)

    最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对“基数”以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了“HyperLogLog”,从而引出了Card ...

  6. LeetCode初级算法--链表02:合并两个有序链表

    LeetCode初级算法--链表02:合并两个有序链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  7. python经典算法题目:找出这两个有序数组的中位数

    题目:找出这两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以 ...

  8. 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串

    最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...

  9. PHP算法之寻找两个有序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2  ...

随机推荐

  1. windows 上运行 sslocal 提示 libcrypto(OpenSSL) not found 解决办法

    1.下载最新版ss客户端,使用pip安装的并不是最新版,去github下载最新版安装 2.安装openssl客户端 OpenSSL for Windows:https://wiki.openssl.o ...

  2. 【云栖社区001-数据结构】如何实现一个高效的单向链表逆序输出(Java版)

    如题 动手之前,发现自己很擅长用C语言来写链表. 不过,既然自己做的是Java开发,那么还是用Java实现这个算法吧:毕竟,以后的若干年里都差不多要跟Java打交道了. 于是,先将Java版的链表自学 ...

  3. httpclient post请求中文乱码解决办法

    在使用httpclient发送post请求的时候,接收端中文乱码问题解决. 正文: 我们都知道,一般情况下使用post请求是不会出现中文乱码的.可是在使用httpclient发送post请求报文含中文 ...

  4. 经肝药酶CYP3A4代谢的药物对比记录

    罗非昔布 罗非昔布,解热镇痛抗炎药,选择性环氧化酶-2(COX-2)抑制药,有研究表明,该类药可增加心脏病发作.卒中或其他严重后果概率,不良反应为,增加心肌梗死和心脏猝死的风险,现已撤市.经肝和肠壁细 ...

  5. selenium原理解析

    相信很多测试小伙伴儿都听过或者使用过web自动化selenium,那您有没有研究过selenium的原理呢?为什么要使用webdriver.exe,webdriver.exe是干啥用的?seleniu ...

  6. LeetCode 1000. Minimum Cost to Merge Stones

    原题链接在这里:https://leetcode.com/problems/minimum-cost-to-merge-stones/ 题目: There are N piles of stones ...

  7. php 正则达达示中的模式修正符

    我们通过元字符和原子完成了正则表达示的入门.有一些特殊情况我们依然需要来处理.深圳dd马达 如果abc在第二行的开始处如何匹配?我不希望正则表达示特别贪婪的匹配全部,只匹配一部份怎么办? 这个时候,我 ...

  8. python3 爬虫继续爬笔趣阁 ,,,,,,,

    学如逆水行舟,不进则退 今天想看小说..找了半天,没有资源.. 只能自己爬了 想了半天.,,,忘记了这个古老的技能 捡了一下 import requests from bs4 import Beaut ...

  9. springboot(二)

    SpringBoot使用JSP 1.创建一个webapp子项目 2.导入依赖 <!-- 配置springboot的父节点依赖,之后引入就不需要添加version配置了! springboot会自 ...

  10. lombok常用注解@Data@AllArgsConstructor@NoArgsConstructor@Builder@Accessors

    原贴:https://blog.csdn.net/ChenXvYuan_001/article/details/84961992 https://blog.csdn.net/weixin_382293 ...