首页 > 其他分享 >力扣数组题分享

力扣数组题分享

时间:2024-05-26 15:01:26浏览次数:16  
标签:right target nums int 力扣 middle 数组 分享 left

文章目录


前言

在学习数据结构的过程中,我通过力扣整理了一些常见的数据结构数组题。这些题目帮助我回顾了学习过程中的关键知识点。

二分查找

力扣题目 704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

示例1

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例2

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

思路

题目前提是数组为有序数组,题目还强调数组中无重复元素。因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。

二分法第一种写法

target 是在左闭右闭的区间里查找,即[left,right]

  1. 循环条件
    • 使用 while (left <= right) 。这是因为当 leftright 相等时,它们指向的数组元素可能是要查找的目标元素。
  2. 中间索引计算
    • 使用 left + ((right - left) / 2) 来计算 middle,这样可以避免整数溢出。
  3. 元素比较与指针更新
    • 如果 nums[middle] == target,则找到目标元素,直接返回 middle
    • 如果 nums[middle] < target,则更新 left = middle + 1,继续在右侧搜索。
    • 如果 nums[middle] > target,则更新 right = middle - 1,继续在左侧搜索。
  4. 返回结果
    • 如果循环结束后仍未找到目标元素,返回 -1 。
  5. 特殊情况处理
    • 如果数组为空,可以在开始时检查,并直接返回-1。
      代码如下:
class Solution {

    public int search(int[] nums, int target) {

        if (nums.length == 0){
            return -1;
        }

        int left = 0;
        int right = nums.length - 1;

        while(left <= right){

            int mid = left + (right - left) / 2;
            
            if (nums[mid] > target){
                right = mid - 1;
            }else if (nums[mid] < target){
                left = mid + 1;
            }else{
                return mid;
            }
        }
        return -1;
    }
}
二分法第二种写法

target 是在左闭右开的区间里查找,即[left,right)

  1. 循环条件:
    • 使用 while (left < right) 。因为区间是左闭右开的,所以当 left 等于 right 时,实际上已经没有元素可以查找了,循环应该终止。
  2. 中间索引计算:
    • 中间索引的计算方式与左闭右闭区间相同,使用 left + (right - left) / 2; 来防止整数溢出。
  3. 元素比较与指针更新:
    • 如果 nums[middle] == target,则找到目标元素,直接返回 middle
    • 如果 nums[middle] < target,则更新 left = middle + 1,继续在右侧搜索。
    • 如果 nums[middle] > target,则更新 right = middle
    • 注意:这里是 right = middle 而不是 right = middle - 1,因为区间是左闭右开的。
  4. 返回结果:
    • 如果循环结束后仍未找到目标元素,则返回 -1。
  5. 特殊情况处理:
    • 与左闭右闭区间一样,开始处检查数组是否为空,并直接返回 -1。
      代码如下:
class Solution {

    public int search(int[] nums, int target) {

        if (nums.length == 0){
            return -1;
        }
      
        int left = 0;
        int right = nums.length - 1;

        while(left < right){

            int mid = left + (right - left) / 2;

            if (nums[mid] > target){
                right = mid;
            }else if (nums[mid] < target){
                left = mid + 1;
            }else{
                return mid;
            }
        }
        return -1;
    }
}

螺旋矩阵 II

力扣题目 59. 螺旋矩阵 II

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

示例1
2024-04-21T23:04:39-dqzqxlbh.jpg

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

示例2

输入:n = 1
输出:[[1]]

提示 :1 <= n <= 20

思路

这一题很考验做题者对代码的掌控能力。我们使用左闭右开原则进行绘图。
2024-04-22T13:42:06-xpleyvad.png

如图所示,我们每次遍历一条边,都是以左闭右开来遍历,这样就不容易出错。
如果是奇数圈的话,我们就对其进行判断,手动将其填充即可。

代码如下:

class Solution {
    public int[][] generateMatrix(int n) {
        // 初始化一个要填充的目标矩阵
        int[][] matrix = new int[n][n];
        // 定义螺旋开始的行和列,标识我们在哪里开始填充矩阵
        int rowStart = 0;
        int columnStart = 0;
        // 定义螺旋的层级,标识我们正在填充的螺旋层级
        int level = 1;
        // 定义边界的偏移量,计算在每一层螺旋中,需要填充的行或列的范围
        int offset = 1;
        // 定义要填充的数字
        int number = 1;
        // 定义行和列的索引
        int row, column;

        // 当螺旋层级小于等于 n / 2 时,进行螺旋填充
        while(level <= n / 2){
            // 从左到右填充上方的行
            for(column = columnStart; column < n - offset; column++){
                matrix[rowStart][column] = number++;
            }
            // 从上到下填充右方的列
            for(row = rowStart; row < n - offset; row++){
                matrix[row][column] = number++;
            }
            // 从右到左填充下方的行
            for(; column > columnStart; column--){
                matrix[row][column] = number++;
            }
            // 从下到上填充左方的列
            for(; row > rowStart; row--){
                matrix[row][column] = number++;
            }
            // 更新螺旋开始的行和列,螺旋层级和边界偏移量
            rowStart++;
            columnStart++;
            level++;
            offset++;
        }
        // 如果 n 是奇数,填充中心的元素
        if(n % 2 != 0){
            matrix[rowStart][columnStart] = number;
        }
        return matrix;
    }
}

为什么循环是 n/2 次

主要是理解螺旋填充的过程。在一个n x n的矩阵中,螺旋填充的过程可以看作是一层一层向内进行的。每一层都是一个环形,从外层开始,逐渐向内层进行。

因为对于一个n x n的矩阵,最多有n / 2层环形(如果n是奇数,中心的单个元素也被视为一层)。

例如,当n = 3时,矩阵如下:

1 2 3
8 9 4
7 6 5

这个矩阵有两层环形,外层环形包含元素1, 2, 3, 4, 5, 6, 7, 8,内层环形(一个点)包含元素9。
所以,当螺旋层级小于等于n / 2时,我们就继续进行螺旋填充,直到所有的环形层级都被填充完毕。

结尾

如果您觉得今天的文章对您有帮助,我相信您一定会喜欢我的博客。
哈利の小屋
在那里,我会定期更新关于计算机类的文章,并与您分享更多实用的经验和知识。欢迎您来访问和留言交流。

标签:right,target,nums,int,力扣,middle,数组,分享,left
From: https://blog.csdn.net/m0_62537698/article/details/139214963

相关文章

  • [学习分享]基于matlab的新安江模型_01_模型介绍与蓄满产流
    写在前面的  最近笔者刚完成水文预报这门课的课程设计,课程设计要求根据课本自行实现新安江模型,完成径流模拟。现在课程设计已经基本全部做完,自己感觉做的也还不错,同时也因为蛮喜欢水文预报这门课的,所以想再对课程设计的整个过程做个整理分享出来,也希望能够帮助到一些困惑于......
  • 剪辑赚钱靠谱吗?剪辑赚钱软件、自媒体怎么入门、自媒体如何赚钱、写作赚钱的平台,软件。
     我试过8种,现在还在搞的只有2个。副业收入每月5k+,算下来平均每天100多,好的时候一天能赚两三百。但是现在搞副业,坑多水深的,太多人栽跟头了,丢几百块都能算少的。我摸索了半年,被骗了2k 元子才开始走对路子。现在收益稳定,而且所有的投入都回本了。今天分享的都是我亲测......
  • JavaScript-数组的增删改查
    数组的操作一共有四种:查询数组数据修改数组中元素的值数组添加新的数据删除数组中的元素数组的初始化有些编程语言的数组初始化是用{}包着的,而JS的数组初始化用[]letnum=[2,6,1,77,52,25,7];数组的查询想要具体查询数组中的某个元素可以用数组名num[i]表示查询数组n......
  • 【数据分享】仙桃市统计年鉴(2011-2023)
    大家好!今天我要向大家介绍一份重要的仙桃市统计数据资源——《仙桃市统计年鉴》。这份年鉴涵盖了从2011年到2023年仙桃市统计全面数据,并提供限时免费下载。(无需分享朋友圈即可获取)数据介绍在数字的海洋中,每一串数据都像是时间的足迹,静默而深刻。今天,让我们一起翻开那本记录着......
  • 程序分享--常见算法/编程面试题:多数元素
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。或关注博主免费专栏【程序......
  • 全免费的数据恢复工具哪个好?分享2024年性价比超高的12款数据恢复软件!
    当您丢失重要文件时,您应该可不想遇到措手不及的情况吧?相反,您需要在系统中使用一些可靠的数据恢复软件,但是全免费的数据恢复工具哪个好呢?别担心,本文将帮助您选择最适合您的解决方案。如何挑选一款合适的数据恢复软件?性能和多功能性:挑选具有高性能的多功能数据恢复软件,它支持......
  • leetcode力扣 2024. 考试的最大困扰度
    一位老师正在出一场由n道判断题构成的考试,每道题的答案为true(用'T'表示)或者false(用'F'表示)。老师想增加学生对自己做出答案的不确定性,方法是最大化有连续相同结果的题数。(也就是连续出现true或者连续出现false)。给你一个字符串answerKey,其中answerKey[i]是第i......
  • (免费领源码)Java/Mysql数据库+53102互联网美食分享平台,计算机毕业设计项目推荐上万套实
    springboot互联网互联网美食分享平台系   院XXXX学科门类XXX专   业 XXX班级XXX学   号XXX姓   名XXX指导菜谱大全 XXX菜谱大全职称XXX2023年2月摘 要大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化......
  • 2831. 找出最长等值子数组力扣解法和辅助图
    题目描述:给你一个下标从0开始的整数数组nums和一个整数k。如果子数组中所有元素都相等,则认为子数组是一个等值子数组。注意,空数组是等值子数组。从nums中删除最多k个元素后,返回可能的最长等值子数组的长度。子数组是数组中一个连续且可能为空的元素序列......
  • leetcode力扣 213. 打家劫舍 II
    计划偷窃沿街的房屋是小偷的计划。在这个地方,所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。但是,相邻的房屋都装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。为了计算在不触动警报装置的情况下,今晚能够偷窃到的最高金额,我们......