int getKth(int k, vector<int>& nums, int begin, int end) { int pivot = nums[end], i, j; for (i = begin, j = begin; j < end; ++j) { if (nums[j] < pivot) swap(nums[i++], nums[j]); } swap(nums[i], nums[end]); if (i == k) return pivot; else if (i < k) return getKth(k, nums, i + 1, end); else return getKth(k, nums, begin, i - 1); }
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int size1 = nums1.size(); int size2 = nums2.size(); int k = (size1 + size2) / 2; int result = getKth(nums1, 0, size1 - 1, nums2, 0, size2 - 1, k + 1); cout << result << endl; if ((size1 + size2) % 2 == 0) { int revise = getKth(nums1, 0, size1 - 1, nums2, 0, size2 - 1, k); cout << revise << endl; return (double)(result + (revise - result) * 0.5); } return (double)result; }
int getKth(vector<int>& nums1, int start1, int end1, vector<int>& nums2, int start2, int end2, int k) { int size1 = end1 - start1 + 1; int size2 = end2 - start2 + 1; if (size1 <= 0 && size2 > 0) return nums2[k - 1]; else if (size2 <= 0 && size1 > 0) return nums1[k - 1]; else if (size1 <= 0 && size2 <= 0) return 0; if (size1 < size2) return getKth(nums2, start2, end2, nums1, start1, end1, k); if (k == 1) return min(nums1[start1], nums2[start2]); int j = min(size2, k / 2); int i = k - j; if (nums1[start1 + i - 1] > nums2[start2 + j - 1]) { return getKth(nums1, start1, end1, nums2, start2 + j, end2, k - j); } else return getKth(nums1, start1 + i, end1, nums2, start2, end2, k - i); }
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ int getKth(struct TreeNode *root, int k, int *val) { if(root == NULL) return 0; int left = getKth(root->left,k,val); if(left + 1 > k) return left; if(left + 1 == k){ *val = root->val; return left+1; } return left + 1 + getKth(root->right,k-left-1,val); }
void doTask4B() { srand(time(0)); auto dataSize = 0; scanf("%d", &dataSize); auto queryCount = 0; scanf("%d", &queryCount); std::vector<int> data(dataSize); for (auto i = 0; i < dataSize; ++i) { scanf("%d", &data[i]); } auto left = 0; auto right = 0; auto k = 0; for (auto i = 0; i < queryCount; ++i) { scanf("%d %d %d", &left, &right, &k); std::vector<int> dataPart(std::vector<int>(data.begin() + left - 1, data.begin() + right)); printf("%d\n", getKth(dataPart, k - 1)); } auto stop = 0; scanf("%d", &stop); }
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ int getKth(struct TreeNode *root, int k, int *val) { if(root == NULL) return 0; int right; int left = getKth(root->left,k,val); if(left > k) { return left; } if(k - left == 1) { *val = root->val; return left + 1; } right = getKth(root->right,k - left - 1, val); return left + 1 + right; }
std::vector<bool> getKth(const std::vector<std::vector<int>> &combinatrix, int from, int choose, int k) { if(from == 1 && choose<=1 && !k) return std::vector<bool>{(bool)choose}; if(choose>from || k>=combinatrix[from][choose]) return std::vector<bool>{}; if(!choose && !k) return std::vector<bool> (from,false); if(from==choose && !k) return std::vector<bool> (from, true); if(k<combinatrix[from][choose]*(from-choose)/from) { // don't choose 1st elt std::vector<bool> res = getKth(combinatrix,from-1,choose,k); if(!res.empty()) res.insert(res.begin(),false); return res; } else { std::vector<bool> res = getKth(combinatrix,from-1,choose-1,k-combinatrix[from][choose]*(from-choose)/from); if(!res.empty()) res.insert(res.begin(),true); return res; } }
int main() { int n = 7; int m = 3; std::vector<std::vector<int>> combinatrix(n+1, std::vector<int>(m+1)); for(auto &v: combinatrix) v[0] = 1; for(int from=1; from<=n; ++from) for(int choose=1; choose<=m; ++choose) combinatrix[from][choose] = combinatrix[from-1][choose]+combinatrix[from-1][choose-1]; for(int k=0; k<combinatrix[n][m]; ++k) { std::vector<bool> combo = getKth(combinatrix, n, m, k); for(bool b: combo) std::cout << b << " "; std::cout << std::endl; } return 0; }
int kthSmallest(struct TreeNode* root, int k) { int val; getKth(root,k, &val); return val; }
int findMedian(vector<int>& nums) { return getKth(nums.size() / 2, nums, 0, nums.size() - 1); }