代码随想录集训营day2-数组part2-c#&(cpp?)

一.碎碎念

集训营看来到第二天就要出问题了,今天本来我在开心的敲代码,忽然许久不见回应的某直聘忽然发来面试邀约,就在4月10号,这家工作室也是我写这么多笔试里面少有的比较对我方向的,考的都是关于unity和c#的东西,但是本来工作室老板跟我约的是快到暑假再面,突然改了主意,有点小打乱我在集训营方面的计划了,我要稍稍的准备一些八股和我的项目,所以最近集训营的内容我会减少掉里面我较为不熟悉的cpp,全部用c#完成。还有值得一提的是这是我人生中第一次面试,我真的很紧张,本来就是水货中的水货,简历上还写的天花乱坠,真没想到人家能看上,本来都备战秋招了,现在给我整这一出。不过这也是一次历练的机会,希望我能不怯场吧,加油喵。

二.正文

1.力扣977有序数组的平方

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

方法1,遍历+排序

 先把数组直接都平方了,然后用个排序函数直接处理掉,非常的方便哈

public class Solution {
    public int[] SortedSquares(int[] nums) {
for(int i=0;i<nums.Length;i++){
    nums[i]*=nums[i];
}
Array.Sort(nums);
return nums;
    }
}

方法2,双指针法

我们继续利用双指针解决这个问题,能注意到题上说它nums之前本来就是非递减顺序排着的,你给他平方完了之后它就有三种可能了,1,它之前全是负数 2,它之前全是正数  3,它之前一半正一半负。那我们想用俩指针,肯定就是左右指针最好,直接拿while遍历一遍,左边设0,右边nums.Length-1,左边右边平方一比,大的放进新数组,然后(左边++/右边--)再次比较,这题就完成了。

public class Solution {
    public int[] SortedSquares(int[] nums) {
        // 将数组中的每个元素平方
        for (int i = 0; i < nums.Length; i++) {
            nums[i] *= nums[i];
        }
        
        // 创建一个新的数组用于存储排序后的结果
        int[] sorted = new int[nums.Length];
        
        // 使用双指针进行插入排序
        int left = 0;
        int right = nums.Length - 1;
        int index = nums.Length - 1; // 从数组的末尾开始插入
        
        while (left <= right) {
            if (nums[left] > nums[right]) {
                sorted[index] = nums[left];
                left++;
            } else {
                sorted[index] = nums[right];
                right--;
            }
            index--;
        }
        
        return sorted;
    }
}

力扣209,长度最小子数组

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

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组

 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

 

方法1,两次遍历

两次遍历直接找出数组里符合条件的最小情况,但是时间复杂度拉满了,过不去新的用例.

public class Solution {
    public int MinSubArrayLen(int target, int[] nums) {
int n=nums.Length;
if(n==0){
    return 0; //如果数组为0返回0
}
int ans=int.MaxValue;  ///初始化一个ans为整形的最大值
for(int i=0;i<n;++i){
    int sum=0;
    for(int j=i;j<n;++j){  //两次遍历找到所有子数组和
        sum+=nums[j];
        if(sum>=target)
        {
            ans=Math.Min(ans,j-i+1);  //超了就跳出循环
            break;
        }
    }
}
return ans==int.MaxValue?0:ans;  //如果最后ans不变就输出0,变了就输出ans

    }
}

 方法2,双指针法

这一题要找相邻的长度最小子数组,那就必须得用快慢指针处理最好,快指针只要发现区间的值小于target就往前,慢指针则是发现区间的值大于target才往前,而只有发现区间和等于target的时候再将长度输入到ans里,ans最后如果不变的话再输出0。

public class Solution {
    public int MinSubArrayLen(int target, int[] nums) {
int start=0,end=0,sum=0;
int ans=int.MaxValue;
int n=nums.Length;
while(end<n){
    sum+=nums[end];
    while(sum>=target){
       ans = Math.Min(ans, end - start + 1);
       sum-=nums[start];
       start++;
    }
    end++;
}
return ans==int.MaxValue?0:ans;
    }
}

力扣59,螺旋矩阵Ⅱ

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

只有一个方法吧应该,这一题真是花了我不少力气,一直在出错,c#这个数组的初始化一直报错,直接给二维数组赋值,但是没有给每个一维数组分配内存空间,只给第一行分了,一直给我报空引用,最后写出来一大长串,打开随想录一看人家的代码,比我至少要少20行,时间紧任务重,二刷再加油。(当然我下面给的是随想录的代码)

public class Solution {
    public int[][] GenerateMatrix(int n) {
        int[][] answer = new int[n][];
        for(int i = 0; i < n; i++)
            answer[i] = new int[n];
        int start = 0;
        int end = n - 1;
        int tmp = 1;
        while(tmp < n * n)
        {
            for(int i = start; i < end; i++) answer[start][i] = tmp++;
            for(int i = start; i < end; i++) answer[i][end] = tmp++;
            for(int i = end; i > start; i--) answer[end][i] = tmp++;
            for(int i = end; i > start; i--) answer[i][start] = tmp++;
            start++;
            end--;
        }
        if(n % 2 == 1) answer[n / 2][n / 2] = tmp;
        return answer;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值