day2 有序数组的平方|长度最小的子数组|螺旋矩阵II

1.有序数组的平方 leetcode 977

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

题目中数组是按升序排序,所以平方后,最大值要么在左边,要么在右边

所以定义两个指针,一个在最左边,一个在最右边,谁大就把谁先加入数组中,加入后,j往左边挪,i右边挪,因为输出数组是按从小到大排序,所以最大的数,放在数组的最后一位,放完后,再放倒数第二位,以此类推

var sortedSquares = function (nums) {
    let arr = new Array(nums.length).fill(0);
    let k = nums.length - 1;
    for (let i = 0, j = nums.length - 1; i <= j;) {
        if (Math.pow(nums[i], 2) > Math.pow(nums[j], 2)) {
            arr[k] = Math.pow(nums[i], 2);
            k--;
            i++
        } else {
            arr[k] = Math.pow(nums[j], 2);
            k--;
            j--
        }
    }
    return arr
};

2.长度最小的子数组leetcode 209

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

此题使用滑动窗口,窗口不断滑动,直到符合题目条件。定义窗口两边i,j.j向后滑动,并且累加j的和,如果和大于等于target,则证明符合题意,此时挪动i,缩小窗口,总数要减去nums[i],因为每次累加值是窗口内的元素之和。

var minSubArrayLen = function (target, nums) {
  let i = 0;
  let sum = 0;
  let min = Infinity;
  for (let j = 0; j < nums.length; j++) {
    sum += nums[j];
    // 此时使用while,不能使用if,如果用if,执行到这里就停了
    while (sum >= target) {
      // 去掉一个nums[i],看总数是否还符合大于等于的条件,不断缩小窗口寻找最小值
      sum -= nums[i]
      min = Math.min(min, j - i + 1)
      i++;
    }
  }
  return min === Infinity ? 0 : min
}

3.螺旋矩阵II leetcode 59

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]] 

这道题有点晕,不知道下次能不能独自做出来

这题主要是要确定每一圈的边界,如果确定了,每一行都要按这个边界判断走,不能随意变动

var generateMatrix = function (n) {
     // 起始位置,因为每圈的起始位置都不一样,所以定义为变量
    let startX = 0;
    let startY = 0;
    let offset = 1;
    // 计数
    let count = 1;
    // 中间值
    let mid = Math.floor(n / 2);
    // 看循环几圈
    let loop = Math.floor(n / 2);
    // 初始化一个二维数组,每个值置为0;
    let res = new Array(n).fill(0).map(() => new Array(n).fill(0))
    while (loop--) {
        let row = startX;
        let col = startY;
        //从左往右添加值 res[0][0] res[0][1]
        for (; col < startY + n - offset; col++) {
            res[row][col] = count++
        }
        //从上到下添加值 res[0][2] res[1][2]
        for (; row < startX + n - offset; row++) {
            res[row][col] = count++
        }
        // 从左往右添加值 res[2][2] res[2][1]
        for (; col > startY; col--) {
            res[row][col] = count++
        }
        // 从下往上添加值 res[2][0] res[1][0]
        for (; row > startX; row--) {
            res[row][col] = count++
        }
        // 更新圈数
        startX++;
        startY++;
        // 更新offset
        offset += 2;
    }

    // 如果是奇数,更新最中间的值
    if (n % 2 === 1) {
        res[mid][mid] = count
    }
    return res

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用C语言编写的二维数组矩阵相乘的代码示例: ``` #include <stdio.h> #include <stdlib.h> typedef struct { int rows; int columns; int **elements; } TwoDArray, *TwoDArrayPtr; TwoDArrayPtr initTwoDArray(int rows, int columns) { TwoDArrayPtr arrayPtr = (TwoDArrayPtr)malloc(sizeof(TwoDArray)); arrayPtr->rows = rows; arrayPtr->columns = columns; arrayPtr->elements = (int**)malloc(rows * sizeof(int*)); for (int i = 0; i < rows; i++) { arrayPtr->elements[i = (int*)malloc(columns * sizeof(int)); } return arrayPtr; } void matrixMultiply(TwoDArrayPtr paraPtr1, TwoDArrayPtr paraPtr2, TwoDArrayPtr *resultPtr) { if (paraPtr1->columns != paraPtr2->rows) { printf("矩阵不能相乘.\r\n"); *resultPtr = NULL; return; } *resultPtr = initTwoDArray(paraPtr1->rows, paraPtr2->columns); for (int i = 0; i < paraPtr1->rows; i++) { for (int j = 0; j < paraPtr2->columns; j++) { int sum = 0; for (int k = 0; k < paraPtr1->columns; k++) { sum += paraPtr1->elements[i][k * paraPtr2->elements[k][j]; } (*resultPtr)->elements[i][j = sum; } } } int main() { TwoDArrayPtr arrayPtr1, arrayPtr2, resultPtr; // 初始化两个矩阵 arrayPtr1 = initTwoDArray(2, 3); arrayPtr2 = initTwoDArray(3, 2); // 对两个矩阵赋值 // 矩阵相乘 matrixMultiply(arrayPtr1, arrayPtr2, &resultPtr); // 打印结果矩阵 for (int i = 0; i < resultPtr->rows; i++) { for (int j = 0; j < resultPtr->columns; j++) { printf("%d ", resultPtr->elements[i][j]); } printf("\n"); } // 释放内存 free(arrayPtr1); free(arrayPtr2); free(resultPtr); return 0; } ``` 这段代码使用了结构体`TwoDArray`来表示二维数组,并定义了`initTwoDArray`函数来初始化二维数组。`matrixMultiply`函数用于计算两个矩阵的乘积,并将结果存储在`resultPtr`指针指向的内存中。最后,在`main`函数中进行了相应的操作和打印结果。 请注意,这只是一个示例代码,具体的实现可能因编程语言或具体需求而有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [数据结构-C语言代码 day9-二维数组矩阵乘法](https://blog.csdn.net/yydslty/article/details/124866964)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [如何将一个二维数组和一个三维数组矩阵相乘得到一个三维数组?](https://blog.csdn.net/weixin_42561476/article/details/112899444)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值