acwing-12
0到n-1中缺失的数字(简单)
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。
在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
样例
输入:[0,1,2,4]
输出:3
- 该数组具有
nums[i]=i
的特点 - 采用二分法,将其中不满足
nums[i]=i
的点的第一个位置查找出来 - 特判是数组最后一个缺失,还是数组中的某一个数缺失
class Solution {
public:
int getMissingNumber(vector<int>& nums) {
if(nums.size()==0)return 0;
int l=0,r=nums.size()-1;
while(l<r){
int mid=(l+r)>>1;
if(nums[mid]==mid)l=mid+1;
else r=mid;
}
if(nums[l]==l)return l+1;
else return nums[l]-1;
}
};
数组中数值和下标相等的元素(简单)
假设一个单调递增的数组里的每个元素都是整数并且是唯一的。
请编程实现一个函数找出数组中任意一个数值等于其下标的元素。
例如,在数组[-3, -1, 1, 3, 5]中,数字3和它的下标相等。
样例
输入:[-3, -1, 1, 3, 5]
输出:3
注意:如果不存在,则返回-1。
- 数组是有序的可以采用二分
- 所求元素具有
nums[i]=i
的特点,所以假如出现这个点的位置的左边都比这个数小,右边都比这个数大,采用这样的性质我们就可以二分得到,可能出现数值和下标相等的元素的位置 - 特判,可能二分得出的数值和下标可能不相等
class Solution {
public:
int getNumberSameAsIndex(vector<int>& nums) {
if(nums.size()==0)return -1;
int l=0,r=nums.size()-1;
while(l<r){
int mid=(l+r)>>1;
if(nums[mid]<mid)l=l+1;
else r=mid;
}
if(nums[l]==l)return l;
return -1;
}
};
二叉搜索树的第k个结点(简单)
给定一棵二叉搜索树,请找出其中的第k小的结点。
你可以假设树和k都存在,并且1≤k≤树的总结点数。
样例
输入:root = [2, 1, 3, null, null, null, null] ,k = 3
2
/ \
1 3
输出:3
- 二叉搜索树数的性质就是它的中序遍历是有序的
- 根据这个有序的特点,我们在进行中序遍历的过程中就可以计算出第k个结点的值到底是那个
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int ans;
TreeNode *res;
TreeNode* kthNode(TreeNode* root, int k) {
ans=k;
dfs(root);
return res;
}
void dfs(TreeNode *root){
if(root!=NULL){
dfs(root->left);
ans--;
if(ans==0){res=root;}
dfs(root->right);
}
}
};