力扣题目——数组

 力扣704二分查找法

class Solution {
public:
// //1.左闭右闭写法
//     int search(vector<int>& nums, int target) {
//         int left = 0,right = nums.size()-1;
//         while(left<=right){
//             int mid = (left+right)/2;
//             if(nums[mid]>target){
//                 right = mid-1;//nums[mid]一定不是要搜索的值
//             }
//             else if(nums[mid]<target){
//                 left = mid+1;
//             }
//             else return mid;
//         }
//         return -1;
//     }
//2.左闭右开写法
    int search(vector<int>& nums, int target) {
        int left = 0,right = nums.size();
        while(left<right){//这儿不能等于
            int mid = (left+right)/2; 
            if(nums[mid]>target){
                right = mid;
            }
            else if(nums[mid]<target){
                left = mid +1;
            }
            else return mid;
        }
        return -1;
    }
};

力扣27移除元素

class Solution {
public:
//双指针
    int removeElement(vector<int>& nums, int val) {
        int i=0,j=0;
        for(;j<nums.size();j++){
            if(nums[j]!=val){
                nums[i++]=nums[j];
            }
        }
        return i;
    }
};

力扣977有序数组的平方

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> res(nums.size());
        int k = res.size()-1;
        int i = 0,j= nums.size()-1;
        while(i<=j){//相等的时候也要继续,否则最后ij指向的元素就没被处理
            if(abs(nums[i])>abs(nums[j])){
                res[k--]=nums[i]*nums[i];
                i++;
            }
            else {
                res[k--]=nums[j]*nums[j];
                j--;
            }
        }
        return res;
    }
};

力扣209长度最小的子数组

class Solution {
public:
//用一个for循环解决 变量j指的是终止位置
    int minSubArrayLen(int target, vector<int>& nums) {
        int minlenth=INT_MAX;//初始为最大值
        int sum=0;//窗口和
        int i=0;
        //j是滑动窗口的右端 i是左端
        for(int j=0;j<nums.size();j++){
            sum+=nums[j];
            //必须用while,不能用if,if只能保证一次 举个例子 nums = 1  1  1  1  100, target=50
            while(sum>=target){         
                minlenth = min(minlenth,j-i+1); 
                sum-=nums[i++];
            }
        }
        if(minlenth==INT_MAX) return 0;//如果不存在符合条件的子数组,返回 0
        return minlenth;
    }
};

力扣59螺旋矩阵

思考:怎么转?

思考:转多少圈?

结论: N/2圈

class Solution {
public:
//规则:左闭右开
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n,vector<int>(n,0));//初始化一个二维矩阵
        int start_x=0,start_y=0;//初始化每一轮遍历的开始坐标,我们认为第一轮是左上角
        int i=0,j=0;
        int time=1;//time表示这是第几轮
        int count=1;//计数
        while(time<=n/2){//转n/2圈
            //从左往右
            for(j=start_y;j<n-time;j++){
                result[start_x][j]=count++;
            }
            //从上往下
            for(i=start_x;i<n-time;i++){
                result[i][j]=count++;//注意不是result[i][start_y]
            }
            //从右往左
            for(j;j>start_y;j--){
                result[i][j]=count++;
            }
            //从下往上
            for(i;i>start_x;i--){
                result[i][j]=count++;
            }
            //每转一圈,需要更新
            time++;//下一轮
            //下一轮起点是原来的右下角
            start_x++;
            start_y++;
        }
        //看看是否是奇数
        if(n%2==1){
            result[start_x][start_y]=count;
        }
        return result;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值