Leetcode704:二分查找
题目:
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例:
示例 1:
输入:nums
= [-1,0,3,5,9,12],target
= 9 输出: 4 解释: 9 出现在nums
中并且下标为 4
示例 2:
输入:nums
= [-1,0,3,5,9,12],target
= 2 输出: -1 解释: 2 不存在nums
中因此返回 -1
解题思路:
这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可以用二分法了。
定义 target 是在一个在左闭右闭的区间里,也就是[left, right] 。
定义target在[left, right]区间,有如下两点:
- while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
代码实现:
int search(int* nums, int numsSize, int target) {
int left=0;
int right=numsSize-1;
int millde=0;
while(left<=right){
millde=((left+right)/2);
if(nums[millde]>target) right=millde-1;
if(nums[millde]<target) left=millde+1;
if(nums[millde]==target) return millde;
}
return -1;
}
Leetcode9:回文数
题目:
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数
是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121
是回文,而123
不是。
示例:
示例 1:
输入:x = 121 输出:true
示例 2:
输入:x = -121 输出:false 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。
解题思路:
while循环的操作就是实现了把输入的x顺序颠倒,比如123变成321,判断颠倒前后是否相等
代码实现:
bool isPalindrome(int x) {
if(x<0)
return false;
int i;
long int m=0;
long int n=x;
while(n!=0){
m=m*10+n%10;
n=n/10;
}
if(m==x) return true;
else return false;
}