【无标题】

力扣第977题-有序数组的平方

题目描述

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序

代码及思路

代码如下

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
    int *ans = malloc(sizeof(int)*numsSize);
     *returnSize=numsSize;
    int k= numsSize-1;
    for(int i=0,j=numsSize-1;i<=j;){
        if(nums[i]*nums[i]<nums[j]*nums[j]){
            ans[k]=nums[j]*nums[j];
            k--;
            j--;
        }
        else {
            ans[k]=nums[i]*nums[i];
            i++;
            k--;
        }
    }
    return ans;
}

思路
采用双指针的办法,先申请一个和原数组一样大的内存,用来按顺序存放平方后的数,首先令i和j指针,i从下标为0开始指,j从最后一个数组元素开始指,采用for循环,依次比较每一次平方后的较大数,将这个数存入新数组的最后一个元素,新数组采用逆序的方法。为什么不采用从小到大呢?因为原数组是按从小到大排列,如果有负数,那么平方后最大数一定是第一个或者是最后一个,比较好容易找出最大平方数,所以采用逆序。

力扣第209-长度最小的子数组

题目描述

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 连续
子数组
[numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:

输入:target = 4, nums = [1,4,4]
输出:1
示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105

代码及思路

代码

int minSubArrayLen(int target, int* nums, int numsSize) {
    int result=INT_MAX;
    int sum=0;
    int sub=0;
    int i=0,j=0;
    for(j=0;j<numsSize;j++){
        sum+=nums[j];
        while(sum>=target){
          sub=j+1-i;
          result=result<sub? result:sub;
          sum=sum-nums[i];
          i++;
        }
    }
    return result==INT_MAX? 0:result;
}

思路
该题采用滑动窗口的方法,滑动窗口其实也就是双指针,先用j指针来遍历,用sum来记录j指针所遍历的数组元素的值之和,当sum>=目标值,
让j先不继续往下遍历,确定当前数组长度,然后将左边的i指针往前移动,缩短窗口的值,再次判断此时sum的值和目标值,所以用一个while循环,最后将每次满足循环的值赋给result,遍历完后,最后判断再遍历过程中,result的值是否发生改变,若改变,则返回改变的值,否则,返回0.

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值