class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
int left{},right = n-1;
while(left <= right){
int mid = (left + right) >> 1;
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target){
right = mid-1;
}else{
left = mid + 1;
}
}
return -1;
}
};
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left{},right = nums.size();
while(left < right){
int mid = left + (right - left)/2;
if(nums[mid] > target){
right = mid;
}else if(nums[mid] < target){
left = mid + 1;
}else{
return mid;
}
}
return right;
}
};
class Solution {
public:
int getRightBoard(vector<int>& nums, int target){
int left{},right = nums.size() -1;
int righBoard{-2};
while(left <= right){
int mid = left + (right - left)/2;
if(nums[mid] <= target){
left = mid + 1;
righBoard = left;
}else{
right = mid -1;
}
}
return righBoard;
}
int getLeftBoard(vector<int>& nums, int target){
int left{},right = nums.size() -1;
int leftBoard{-2};
while(left <= right){
int mid = left + (right - left)/2;
if(nums[mid] >= target){
right = mid -1;
leftBoard = right;
}else{
left = mid +1;
}
}
return leftBoard;
}
vector<int> searchRange(vector<int>& nums, int target) {
int left{-2},right{-2};
left = getLeftBoard(nums,target);
right = getRightBoard(nums,target);
if(left == -2 || right== -2) return{-1,-1};
if(right - left > 1) return {left +1,right-1};
return {-1,-1};
}
};
class Solution {
public:
int mySqrt(int x) {
int left{},right = x;
int ans{};
while(left <= right){
int mid = left + (right - left)/2;
long long mul = (long long)mid * mid;
if(mul == x){
return mid;
}else if(mul < x){
ans = mid;
left = mid +1;
}else{
right = mid - 1;
}
}
return ans;
}
};
class Solution {
public:
bool isPerfectSquare(int num) {
int left{1},right = num;
while(left <= right){
int mid = left + (right - left)/2;
long long mul = (long long)mid*mid;
if(mul == num){
return true;
}else if(mul > num){
right = mid -1;
}else {
left = mid + 1;
}
}
return false;
}
};
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left{},right{};
int n = nums.size();
for(;right < n;++right){
if(nums[right] != val){
swap(nums[left++],nums[right]);
}
}
return left;
}
};
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int slowIndex{},fastIndex{1};
for(;fastIndex < nums.size();++fastIndex){
if(nums[fastIndex] != nums[fastIndex-1]){
nums[++slowIndex] = nums[fastIndex];
}
}
return slowIndex+1;
}
};
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slowIndex{},fastIndex{};
int n = nums.size();
for(;fastIndex < n;++fastIndex){
if(nums[fastIndex] != 0){
swap(nums[slowIndex++],nums[fastIndex]);
}
}
}
};
class Solution {
public:
bool backspaceCompare(string s, string t) {
int nS = s.size();
int nT = t.size();
int indexS = nS-1;
int indexT = nT-1;
while(indexS >=0 || indexT >=0){
int countS{};
int countT{};
while(indexS >=0){
if(s[indexS] == '#'){
countS++;
indexS--;
}else if(countS > 0){
countS--;
indexS--;
}else {
break;
}
}
while(indexT >=0){
if(t[indexT] == '#'){
countT++;
indexT--;
}else if(countT > 0){
countT--;
indexT--;
}else {
break;
}
}
if(indexT >=0 && indexS >=0){
if(s[indexS] != t[indexT]){
return false;
}
}else if(indexS >=0 || indexT >=0){
return false;
}
--indexT;
--indexS;
}
return true;
}
};
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left{},right = nums.size()-1;
vector<int> result(nums.size());
int index = nums.size()-1;
while(left <= right){
if(abs(nums[left]) > abs(nums[right])){
result[index--] = nums[left]*nums[left++];
}else{
result[index--] = nums[right]*nums[right--];
}
}
return result;
}
};
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT_MAX;
int i{};
int j{};
int sum{};
int subLength{};
for(;j<nums.size();++j){
sum += nums[j];
while(sum >= target){
subLength = j-i + 1;
result = result < subLength ? result : subLength;
sum-=nums[i++];
}
}
return result == INT_MAX ? 0 : result;
}
};
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int i{};
int j{};
int len{};
int ans{};
unordered_map<int,int> mp;
for(;j<fruits.size();++j){
mp[fruits[j]]++;
len++;
while(mp.size() > 2){
mp[fruits[i]]--;
if(mp[fruits[i]] == 0) mp.erase(fruits[i]);
len--;
i++;
}
if(ans < len){
ans = len;
}
}
return ans;
}
};
class Solution {
public:
string minWindow(string s, string t) {
vector<int> need(128);
for(char c : t) need[c]++;
int left{},right{};
int start{};
int count = t.size();
int size = INT_MAX;
for(;right < s.size();++right){
char c = s[right];
if(need[c] > 0) count--;
need[c]--;
if(count == 0){
while(left < right && need[s[left]] < 0){
need[s[left++]]++;
}
if(right - left + 1 < size){
size = right - left + 1;
start = left;
}
need[s[left++]]++;
count++;
}
}
return size == INT_MAX ? "" : s.substr(start,size);
}
};
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int startx = 0, starty = 0;
int loop = n / 2;
int mid = n / 2;
int count = 1;
int offset = 1;
int i,j;
while (loop --) {
i = startx;
j = starty;
for (j = starty; j < starty + n - offset; j++) {
res[startx][j] = count++;
}
for (i = startx; i < startx + n - offset; i++) {
res[i][j] = count++;
}
for (; j > starty; j--) {
res[i][j] = count++;
}
for (; i > startx; i--) {
res[i][j] = count++;
}
startx++;
starty++;
offset += 2;
}
if (n % 2) {
res[mid][mid] = count;
}
return res;
}
54.螺旋矩阵
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
vector<int> ans;
int u = 0;
int r = n-1;
int d = m-1;
int l = 0;
while(true){
for(int i = l;i <= r;++i) ans.push_back(matrix[u][i]);
if(++u > d) break;
for(int i = u; i<=d;++i) ans.push_back(matrix[i][r]);
if(--r < l) break;
for(int i = r;i>=l;--i) ans.push_back(matrix[d][i]);
if(--d < u) break;
for(int i = d;i>=u;--i) ans.push_back(matrix[i][l]);
if(++l > r) break;
}
return ans;
}
};
剑指 Offer 29.顺时针打印矩阵
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.size() == 0 ) return {};
int m = matrix.size();
int n = matrix[0].size();
vector<int> result;
int l{},r{n-1},u{},d{m-1};
while(true){
for(int i = l;i <= r;++i) result.emplace_back(matrix[u][i]);
if(++u > d) break;
for(int i = u;i<=d;++i) result.emplace_back(matrix[i][r]);
if(--r < l) break;
for(int i = r;i>=l;--i) result.emplace_back(matrix[d][i]);
if(--d < u) break;
for(int i = d;i>=u;--i) result.emplace_back(matrix[i][l]);
if(++l > r) break;
}
return result;
}