#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class SquareFinder {
public:
int getKthSmallestSquare(const vector<int>& nums, int k) {
int n = nums.size();
// 1. Binary Search to find the first non-negative element
// O(log N)
int right = lower_bound(nums.begin(), nums.end(), 0) - nums.begin();
int left = right - 1;
long long kthSquare = 0;
int count = 0;
// 2. Expand outward k times
// O(K)
while (count < k) {
// Calculate squares for current pointers
// Use -1 or a large value to indicate out-of-bounds
long long leftSq = (left >= 0) ? (long long)nums[left] * nums[left] : -1;
long long rightSq = (right < n) ? (long long)nums[right] * nums[right] : -1;
if (left < 0) {
// Only positive numbers remain
kthSquare = rightSq;
right++;
}
else if (right >= n) {
// Only negative numbers remain
kthSquare = leftSq;
left--;
}
else if (leftSq < rightSq) {
// Negative number's square is smaller
kthSquare = leftSq;
left--;
}
else {
// Positive number's square is smaller
kthSquare = rightSq;
right++;
}
count++;
}
return (int)kthSquare;
}
};
int main() {
SquareFinder sf;
// Sorted array
vector<int> nums = {-10, -5, -2, 0, 1, 3, 15};
int k = 4;
// Squares: 0, 1, 4, 9, 25, 100, 225
// 4th smallest should be 9
cout << "The " << k << "-th smallest square is: " << sf.getKthSmallestSquare(nums, k) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFNxdWFyZUZpbmRlciB7CnB1YmxpYzoKICAgIGludCBnZXRLdGhTbWFsbGVzdFNxdWFyZShjb25zdCB2ZWN0b3I8aW50PiYgbnVtcywgaW50IGspIHsKICAgICAgICBpbnQgbiA9IG51bXMuc2l6ZSgpOwoKICAgICAgICAvLyAxLiBCaW5hcnkgU2VhcmNoIHRvIGZpbmQgdGhlIGZpcnN0IG5vbi1uZWdhdGl2ZSBlbGVtZW50CiAgICAgICAgLy8gTyhsb2cgTikKICAgICAgICBpbnQgcmlnaHQgPSBsb3dlcl9ib3VuZChudW1zLmJlZ2luKCksIG51bXMuZW5kKCksIDApIC0gbnVtcy5iZWdpbigpOwogICAgICAgIGludCBsZWZ0ID0gcmlnaHQgLSAxOwoKICAgICAgICBsb25nIGxvbmcga3RoU3F1YXJlID0gMDsKICAgICAgICBpbnQgY291bnQgPSAwOwoKICAgICAgICAvLyAyLiBFeHBhbmQgb3V0d2FyZCBrIHRpbWVzCiAgICAgICAgLy8gTyhLKQogICAgICAgIHdoaWxlIChjb3VudCA8IGspIHsKICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNxdWFyZXMgZm9yIGN1cnJlbnQgcG9pbnRlcnMKICAgICAgICAgICAgLy8gVXNlIC0xIG9yIGEgbGFyZ2UgdmFsdWUgdG8gaW5kaWNhdGUgb3V0LW9mLWJvdW5kcwogICAgICAgICAgICBsb25nIGxvbmcgbGVmdFNxID0gKGxlZnQgPj0gMCkgPyAobG9uZyBsb25nKW51bXNbbGVmdF0gKiBudW1zW2xlZnRdIDogLTE7CiAgICAgICAgICAgIGxvbmcgbG9uZyByaWdodFNxID0gKHJpZ2h0IDwgbikgPyAobG9uZyBsb25nKW51bXNbcmlnaHRdICogbnVtc1tyaWdodF0gOiAtMTsKCiAgICAgICAgICAgIGlmIChsZWZ0IDwgMCkgewogICAgICAgICAgICAgICAgLy8gT25seSBwb3NpdGl2ZSBudW1iZXJzIHJlbWFpbgogICAgICAgICAgICAgICAga3RoU3F1YXJlID0gcmlnaHRTcTsKICAgICAgICAgICAgICAgIHJpZ2h0Kys7CiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGVsc2UgaWYgKHJpZ2h0ID49IG4pIHsKICAgICAgICAgICAgICAgIC8vIE9ubHkgbmVnYXRpdmUgbnVtYmVycyByZW1haW4KICAgICAgICAgICAgICAgIGt0aFNxdWFyZSA9IGxlZnRTcTsKICAgICAgICAgICAgICAgIGxlZnQtLTsKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSBpZiAobGVmdFNxIDwgcmlnaHRTcSkgewogICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgbnVtYmVyJ3Mgc3F1YXJlIGlzIHNtYWxsZXIKICAgICAgICAgICAgICAgIGt0aFNxdWFyZSA9IGxlZnRTcTsKICAgICAgICAgICAgICAgIGxlZnQtLTsKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBQb3NpdGl2ZSBudW1iZXIncyBzcXVhcmUgaXMgc21hbGxlcgogICAgICAgICAgICAgICAga3RoU3F1YXJlID0gcmlnaHRTcTsKICAgICAgICAgICAgICAgIHJpZ2h0Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKGludClrdGhTcXVhcmU7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIFNxdWFyZUZpbmRlciBzZjsKICAgIC8vIFNvcnRlZCBhcnJheQogICAgdmVjdG9yPGludD4gbnVtcyA9IHstMTAsIC01LCAtMiwgMCwgMSwgMywgMTV9OwogICAgaW50IGsgPSA0OyAKCiAgICAvLyBTcXVhcmVzOiAwLCAxLCA0LCA5LCAyNSwgMTAwLCAyMjUKICAgIC8vIDR0aCBzbWFsbGVzdCBzaG91bGQgYmUgOQogICAgY291dCA8PCAiVGhlICIgPDwgayA8PCAiLXRoIHNtYWxsZXN0IHNxdWFyZSBpczogIiA8PCBzZi5nZXRLdGhTbWFsbGVzdFNxdWFyZShudW1zLCBrKSA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9