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;
}
Esempio n. 7
0
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;
   }
}
Esempio n. 8
0
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);
 }