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. Python学习进阶

    阅读目录 一.python基础 二.python高级 三.python网络 四.python算法与数据结构 一.python基础 人生苦短,我用Python(1) 工欲善其事,必先利其器(2) pyt ...

  2. css 的弱化与 js 的强化(转)

    web 的三要素 html, css, js 在前端组件化的过程中,比如 react.vue 等组件化框架的运用,使 html 的弱化与 js 的强化 成为了一种趋势,而在这个过程中,其实还有另一种趋 ...

  3. 创建django项目完整实例

    虚拟环境搭配 安装和配置 安装虚拟环境的命令: 1)sudo pip install virtualenv #安装虚拟环境 2)sudo pip install virtualenvwrapper # ...

  4. Mybatis框架-@Param注解

    回顾一下上一个小demo中存在的问题,是是根据用户的id修改用户的密码,我们只是修改了用户的密码,结果我们的在写接口方法的时候掺入的参数确实一个User对象,这样让别人看到我们的代码真的是很难读懂啊! ...

  5. janusgraph-图数据库的学习(2)

    janusgraph的简单使用 当安装好以后简单的使用janusgraph 1.进入janusgraph的shell命令界面 [root@had214 janusgraph-0.3.1-hadoop2 ...

  6. LeetCode 1061. Lexicographically Smallest Equivalent String

    原题链接在这里:https://leetcode.com/problems/lexicographically-smallest-equivalent-string/ 题目: Given string ...

  7. 使用vault pki 为nginx 生成tls 证书文件

    关于vault pki 管理的使用的可以参考官方文档或者docker-vault 以下演示一个简单的基于vault pki 为nginx 提供tls 证书 项目环境配置 nginx 配置文件   wo ...

  8. codevs 2780 ZZWYYQWZHZ

    2780 ZZWYYQWZHZ  时间限制: 1 s  空间限制: 32000 KB  题目等级: 青铜 Bronze       题目描述 Description 可爱的小管在玩吹泡泡.忽然,他想到 ...

  9. 【loj3045】【ZJOI2019】开关

    题目 \(n\)个开关,一开始处于关闭状态,你需要将他们按成\(s\)状态,按成了之后就停止操作; 每次按下开关的i概率为\(\frac{p_i}{\sum_{i=1}^{n}p_i}\) ,问期望步 ...

  10. (转)React事件处理函数必须使用bind(this)的原因

    1.JavaScript自身特性说明如果传递一个函数名给一个变量,之后通过函数名()的方式进行调用,在方法内部如果使用this则this的指向会丢失.示例代码:首先我们创建test对象并直接调用方法 ...