64,074
社区成员
第一题:搜索旋转排序数组
使用二分查找,先利用二分查找找出断点,再根据目标值位置断点一侧继续用二分法寻找目标元素。
int search(int* nums, int numsSize, int target){
//先利用二分法寻找数组的最小值,即开始旋转的下标k
int low = 0,high = numsSize-1;
int mid = 0;
while(low<=high){
mid = (high+low)/2;
if(nums[mid]>nums[0])//向右查找
low = mid+1;
else if(nums[mid]<nums[0]&&nums[mid-1]>nums[0])//此时mid恰好为开始旋转的下标
break;
else
high = mid-1;
}
//再将下标值k对应的值与目标值比较,继续利用二分法在一边查找目标值
if(nums[mid]==target)
return mid;
if(target<nums[0]||mid==0){
low = mid+1;
high = numsSize-1;
}else{
low = 0;
high = mid-1;
}
while(low<=high){
mid = (high+low)/2;
if(target==nums[mid])
return mid;
else if(target>nums[mid])
low = mid+1;
else
high = mid-1;
}
return -1;
}
第二题:搜索旋转排序数组 II
第三题:寻找旋转排序数组中的最小值
第四题:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
方法一:动态规划,利用斐波那契数列计算。
第五题:斐波那契数
第六题:第 N 个泰波那契数
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2。给你整数 n,请返回第 n 个泰波那契数 Tn 的值。
第七题:差的绝对值为 K 的数对数目
第八题:猜数字
小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?
输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。
第九题:拿硬币
桌上有 n
堆力扣币,每堆的数量保存在数组 coins
中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。
1.二分查找
当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。
基本思想:假设数据是按升序排序的,对于给定值n,从序列的中间位置mid开始比较,
如果当前位置arr[mid]值等于n,则查找成功;
若n小于当前位置值arr[mid],则在数列的前半段中查找,arr[left,mid-1];
若n大于当前位置值arr[mid],则在数列的后半段中继续查找arr[left+1,right],
直到找到为止,时间复杂度:O(log(n)) 。