T1:数组中不等三元组的数目
题目意思很简单,直接两个for循环加一个while判断就好。(相当于三重for循环) 注意三个指针之间的关系和边界即可。
class Solution {
public:
int unequalTriplets(vector<int>& nums) {
int l = 0 ;
int n = nums.size();
int res = 0;
while(l < n - 2){
for(int i = l + 1 ; i < n -1 ;i++){
for(int j = i + 1 ; j < n ; j++){
if(nums[i] != nums[l] && nums[i] != nums[j] && nums[l] != nums[j]){
// cout << l << i << j<< endl;
res++;
}
}
}
l++;
}
return res;
}
};
T2:二叉搜索树最近节点查询
这个题目一开始我的想法是直接在二叉搜索树里面查找满足条件的值。也写了两个搜索函数出来。但是最后也没有调试出结果。比赛结束后在同学的提醒下才明白可以将搜索树展开为一个数组,再在数组中用二分法查找即可。
在二分查找之前要处理一下两种特殊情况 一是目标值小于数组最小值,二是目标值大于数组最大值。
if(target<nums[0])return {-1,nums[0]};
else if(target>nums[nums.size()-1])return {nums[nums.size()-1],-1};
要注意在二分搜索的时候返回的是一个元组。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> nums;
void search (TreeNode* root){
if(root == nullptr) return;
search(root -> left);
nums.push_back(root -> val);
search(root -> right);
}
tuple<int,int> mid_search(vector<int>& nums,int target)
{
if(target<nums[0])return {-1,nums[0]};
else if(target>nums[nums.size()-1])return {nums[nums.size()-1],-1};
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int mid=(left+right)/2;
if(nums[mid]==target)return {nums[mid],nums[mid]};
else if(nums[mid]>target) right=mid-1;
else left=mid+1;
}
return {nums[right],nums[left]};
}
vector<vector<int>> closestNodes(TreeNode* root, vector<int>& queries) {
vector<vector<int>>res;
search(root);
int n = (int)nums.size();
for(int i = 0 ; i < queries.size() ; i++){
vector<int>ans(2);
int k = queries[i];
auto[val1,val2]=mid_search(nums,k);
ans[0] = val1;
ans[1] = val2;
res.push_back({ans[0] , ans[1]});
}
return res;
}
};