备战复试,每日三题Day06

备战复试,每日三题

题目一: 至少是其他数字两倍的最大值(leetcode1.13每日一题)

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。

请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。

示例 1:

输入:nums = [3,6,1,0]
输出:1
解释:6 是最大的整数,对于数组中的其他整数,6 大于数组中其他元素的两倍。6 的下标是 1 ,所以返回 1 。
示例 2:

输入:nums = [1,2,3,4]
输出:-1
解释:4 没有超过 3 的两倍大,所以返回 -1 。
示例 3:

输入:nums = [1]
输出:0
解释:因为不存在其他数字,所以认为现有数字 1 至少是其他数字的两倍。

提示:

1 <= nums.length <= 50
0 <= nums[i] <= 100
nums 中的最大元素是唯一的

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-number-at-least-twice-of-others

class Solution {
public:
    int dominantIndex(vector<int>& nums) {
        int max=nums[0];
        int temp=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]>max){
                max=nums[i];
                temp=i;
            }
        }
        for(int i=0;i<nums.size();i++){
            if(max==nums[i]) continue;
            if(max<nums[i]*2){
                return -1;
            }
        }
        return temp;
       
    }
};

题目二: 爬楼梯

假设你正在爬楼梯。需要 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 阶

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs

基础的动态规划

class Solution {
public:
    int climbStairs(int n) {
        int dp[n+1];
        dp[0]=1;
        dp[1]=1;
        for(int i=2;i<=n;i++){
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
};

题目三: 旋转链表

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
示例 2:

输入:head = [0,1,2], k = 4
输出:[2,0,1]

提示:

链表中节点的数目在范围 [0, 500] 内
-100 <= Node.val <= 100
0 <= k <= 2 * 109

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-list

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        //快慢指针 
        if(head==nullptr||head->next==nullptr) return head;
        ListNode *p=head,*q; //p为慢指针,q为快指针
        int len=0;
        //计算链表长度
        while(p!=nullptr){
            p=p->next;
            len++;
        }
        //取余
        k=k%len;
        p=head;
        //算出快指针的起始位置
        for(int i=0;i<k;i++){
            p=p->next;
        }
        q=p;
        p=head;
        //快慢指针同时移动,直到快指针指向最后一个元素
        while(q->next!=nullptr){
            q=q->next;
            p=p->next;
        }
        //此时慢指针的next即为移动后的链表的头结点,此时需要做三件事:
        //①q->next指向head;
        q->next=head;
        // ②p->next赋给head;
        head=p->next;
        // ③断开p所指节点与head所指节点;
        p->next=nullptr;
        return head;
    }
};

本题的核心思想就是对倒数第K个节点的操作,倒数第K个节点即为新的头结点,他需要与倒数第K-1个节点断开连接,同时原链表的最后一个节点与原链表的头结点连接(快慢指针问题)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值