数组+双指针0406

977. 有序数组的平方 - 力扣(LeetCode)

int n= nums.size();

    vector<int> ans(n,0);

        for (int i = 0,j=n-1,pos=n-1; i <=j; ) {

            if (nums[i]*nums[i]>nums[j]*nums[j]){

                ans[pos]=nums[i]*nums[i];

                i++;

            }else {

                ans[pos]=nums[j]*nums[j];

                j--;

            }

            pos--;

        }

        return ans;

    }

209. 长度最小的子数组 - 力扣(LeetCode)

/*//暴力求解
    int len = nums.size();
    int minimum=INT_MAX;
    for(int i = 0; i < len; i++ ){
        //此处未思考
        int sum = nums[i];
        if (sum >= target)
            return 1;
        for(int j = i + 1; j < len; j++){
            sum += nums[j];
            if(sum >= target){
                minimum=min(minimum,j-i+1);
                break;
            }
        }
    }
    return minimum==INT_MAX ? 0 : minimum;*/
//双指针 快慢指针
//双指针 快慢指针
    /*int l = 0,r = 0,sum = 0,minimum = INT_MAX;
    int len = nums.size();
    while(r < len){
        sum += nums[r++];
        while(sum >= target){//此处应为循环 实现重复出入队列
            minimum=min(minimum,r-l);
            sum-=nums[l++];
        }
    }
    return minimum==INT_MAX ? 0 : minimum;*/
//滑动窗口
 /* //滑动窗口
     int l=0, r= nums.size(), min=0;
     while(l <= r){
         int mid = (l+r) >> 1;//右移
         if(windowExist(mid, nums, target)){
             r=mid-1;
             min =mid;
         }else
             l =mid + 1;//不满足条件 窗口过小 扩容
     }
     return min;*/
//二分查找
//二分查找
    //Java函数 int index = Arrays.binarySearch(sums, target);如果找到就会返回值的下标,如果没找到就会返回一个负数,这个负数取反之后就是查找的值应该在数组中的位置 [1] 搜索值不是数组元素,且在数组范围内,从1开始计数,得“ - 插入点索引值”;
    //构造函数 int search(vector<int>& nums, int target)
    int len=nums.size();
    int minimum = INT_MAX;
    vector<int> sums(len+1,0);
    for (int i = 1; i <= len; ++i) {
        sums[i]=sums[i-1]+nums[i-1];
    }
    for (int i = 0; i <= len; ++i) {
        int index = search(sums,target+sums[i]);
        if(index < 0){
           minimum = minimum;
        }else if(index <= len){
            minimum=min(minimum,index-i);
        }

    }
    return minimum == INT_MAX ? 0 : minimum;
}
int search(vector<int>& nums, int target) {
    int len = nums.size();
    int l = 0,r = len-1;
    if(target > nums[r]){return -1;}//比右边界还大
    while(l <= r){
        int middle = (l+r)/2;
        if(target < nums[middle]){
            r = middle-1;
        }else if(target>nums[middle]){
            l = middle+1;
        }else{
            return middle;
        }
    }
    return l;//vector不存在该元素 返回插入位置
}

59. 螺旋矩阵 II - 力扣(LeetCode)

vector<vector<int>> generateMatrix(int n) {

        vector<vector<int>>ans(n, vector<int>(n, 0));

        int tr=0,tc=0;

        int dr=n-1,dc=n-1;

        int index=1;

        while (tr<=dr&&tc<=tr){

            for (int col = tc; col <=dc; col++) {

                ans[tr][col]=index++;

            }

            for (int row = tr+1; row <=dr ; row++) {

                ans[row][dc]=index++;

            }

            if (tr<dr&&tc<dc){

                for (int column = dc-1; column >tc; column--) {

                    ans[dr][column]=index++;

                }

                for (int row = dr; row >tr; row--) {

                    ans[row][tc]=index++;

                }

            }

            tr++;dr--;

            tc++;dc--;

        }

        return ans;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值