[小玄的刷题日记]《LeetCode零基础指南》(第4讲) 数组

33. 搜索旋转排序数组 - 力扣(LeetCode) (leetcode-cn.com)

 方法一,遍历法

int search(int* nums, int numsSize, int target){
    int i = 0;
    for(i = 0;i < numsSize;i++)
    {
        if(nums[i] == target)
            return i;
    }
    return -1;
}

方法二,二分查找

由题意可知,这道题在旋转后只能保证局部有序,因此,相较于有序的数组,我们需要进行进一步的思考。

可以发现,我们将数组分成两部分来看的时候,一定有一部分的数组是有序的

以   [4,5,6,7,0,1,2]  为例:,我们从 6 这个位置分开后数组变成了 [ 4 , 5 , 6 ] [ 7 , 0 , 1 , 2]

其中左边的[ 4 , 5 , 6 ]是有序的,其他也是如此。

这启示我们在常规的二分查找时查看当前 mid 为分割出来的两个部分 [ l , mid ] [ mid + 1 , r ]哪个部分是有序的,并根据有序的那个部分确定我们该如何改变二分查找的上下界,因为我们能根据有序的那部分判断出 target 在不在这个部分。

 

int search(int* nums, int numsSize, int target){
    int low=0,high=numsSize-1;int output=-1;
    while(low<=high){
        int mid=(low+high)/2;
        if(nums[mid]==target){
            output=mid;
            return output;
        }
        if(nums[low]<=nums[mid]){
            if(target>=nums[low]&&target<nums[mid])
                high=mid-1;
            else
                low =mid+1;
        }
        else{
            if(target>nums[mid]&&target<=nums[high])
                low=mid+1;
            else
                high=mid-1;
        }
    }
    return -1;
}

81. 搜索旋转排序数组 II - 力扣(LeetCode) (leetcode-cn.com)

方法一,遍历法 

bool search(int* nums, int numsSize, int target){
    int i = 0;
    for(i = 0;i < numsSize;i++)
    {
        if(nums[i] == target)
            return true;
    }
    return false;
}

方法二,二分查找

bool search(int* nums, int numsSize, int target) {
    if (numsSize == 0)
        return false;
    if (numsSize == 1)
        return nums[0] == target;
    int l = 0, r = numsSize - 1;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (nums[mid] == target)
            return true;
        if (nums[l] == nums[mid] && nums[mid] == nums[r]) {
            ++l;
            --r;
        } else if (nums[l] <= nums[mid]) {
            if (nums[l] <= target && target < nums[mid])
                r = mid - 1;
            else
                l = mid + 1;
        } else {
            if (nums[mid] < target && target <= nums[numsSize - 1])
                l = mid + 1;
            else
                r = mid - 1;
        }
    }
    return false;
}


33. 搜索旋转排序数组 - 力扣(LeetCode) (leetcode-cn.com)

方法一,遍历法 

int findMin(int* nums, int numsSize){
    int i = 0;
    int min = 5000;
    for(i = 0;i < numsSize;i++)
    {
        if(nums[i] < min)
            min = nums[i];
    }
    return min;
}

方法二,二分查找

int search(int* nums, int numsSize, int target){
    int low=0,high=numsSize-1;int output=-1;
    while(low<=high){
        int mid=(low+high)/2;
        if(nums[mid]==target){
            output=mid;
            return output;
        }
        if(nums[low]<=nums[mid]){
            if(target>=nums[low]&&target<nums[mid])
                high=mid-1;
            else
                low =mid+1;
        }
        else{
            if(target>nums[mid]&&target<=nums[high])
                low=mid+1;
            else
                high=mid-1;
        }
    }
    return -1;
}


 70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)

对于这道题,本质上是斐波那契数列。

对于第n阶台阶,由于我们一次可以走1阶或者是2阶,走到n阶的总方法等于走到(n-1)阶的总方法 + 走到(n-2)阶的总方法,所以可以得到如下的表达式

F(n) = F(n - 1) + F(n - 2) 

int climbStairs(int n){
    if(n == 1)
        return 1;
    else
    {
        int i = 0;
        int a = 1;
        int b = 1;
        for(i = 0;i < n - 1;i++)
        {
            b = a + b;
            a = b - a;
        }
        return b;
    }
}

 509. 斐波那契数 - 力扣(LeetCode) (leetcode-cn.com)

int fib(int n)
{
    if(n <= 1)
    return n;
    int first = 0;
    int second = 1;
    for(int i = 0;i < n-1;i++)
    {
        int sum = first + second;
        first = second;
        second = sum;
    }
    return second;
}

​​​​​​\1137. 第 N 个泰波那契数 - 力扣(LeetCode) (leetcode-cn.com)

int tribonacci(int n){
    if(n == 0)
        return 0;
    else if(n == 1 || n == 2)
        return 1;
    else
    {
        int a = 0;
        int b = 1;
        int c = 1;
        int i = 0;
        int sum = 0;
        for(i =0;i < n - 2;i++)
        {
            sum = a + b + c;
            a = b;
            b = c;
            c = sum;
        }
        return sum;
    }
}

​​​​​​2006. 差的绝对值为 K 的数对数目 - 力扣(LeetCode) (leetcode-cn.com)

int countKDifference(int* nums, int numsSize, int k){
    int i = 0;
    int j = 0;
    int count = 0;
    for(i = 0;i <numsSize;i++)
    {
        for(j = i + 1;j < numsSize;j++)
        {
            if(nums[i] - nums[j] == k || nums[i] - nums[j] == -k)
                count++;
        }
    }
    return count;
}

 LCP 06. 拿硬币 - 力扣(LeetCode) (leetcode-cn.com)

 

利用向下取整的性质进行计算 


  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄澈_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值