备战复试,每日三题
题目一: 至少是其他数字两倍的最大值(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 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 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个节点断开连接,同时原链表的最后一个节点与原链表的头结点连接(快慢指针问题)