Rust每日一练(Leetday0027) 单词搜索、删除重复项II、搜索旋转排序数组II

news/2024/7/7 18:46:18

目录

79. 单词搜索 Word Search  🌟🌟

80. 删除有序数组中的重复项 II Remove-duplicates-from-sorted-array-II  🌟🌟

81. 搜索旋转排序数组 II Search-in-rotated-sorted-array-II  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


79. 单词搜索 Word Search

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • board 和 word 仅由大小写英文字母组成

进阶:你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?

代码:

fn exist(board: Vec<Vec<char>>, word: String) -> bool {
    let mut board = board;
    let m = board.len();
    let n = board[0].len();

    for i in 0..m {
        for j in 0..n {
            if search(&mut board, &word, i, j, 0) {
                return true;
            }
        }
    }

    false
}

fn search(board: &mut Vec<Vec<char>>, word: &String, i: usize, j: usize, k: usize) -> bool {
    if k == word.len() {
        return true;
    }
    if i >= board.len() || j >= board[i].len() || board[i][j] != word.chars().nth(k).unwrap() {
        return false;
    }
    let c = board[i][j];
    board[i][j] = '#'; // 标记已访问

    if search(board, word, i + 1, j, k + 1)
        || search(board, word, i, j + 1, k + 1)
        || search(board, word, i - 1, j, k + 1)
        || search(board, word, i, j - 1, k + 1)
    {
        return true;
    }
    board[i][j] = c; // 还原
    false
}

fn main() {
    let board = vec![
        vec!['A', 'B', 'C', 'E'],
        vec!['S', 'F', 'C', 'S'],
        vec!['A', 'D', 'E', 'E'],
    ];
    println!("{}", exist(board, String::from("ABCCED")));
}

输出:

true
true
false


80. 删除有序数组中的重复项 II Remove-duplicates-from-sorted-array-II

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

示例 1:

输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。

提示:

  • 1 <= nums.length <= 3 * 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 已按升序排列

相关题目: 26. 删除有序数组中的重复项

代码:

fn remove_duplicates(nums: &mut Vec<i32>) -> i32 {
    if nums.len() <= 2 {
        return nums.len() as i32;
    }
    let mut i = 1;
    for j in 2..nums.len() {
        if nums[j] != nums[i - 1] {
            i += 1;
            nums[i] = nums[j];
        }
    }
    (i + 1) as i32
}

fn main() {
    let mut nums = vec![1, 1, 1, 2, 2, 3];
    println!("{}", remove_duplicates(&mut nums));

    let mut nums = vec![0, 0, 1, 1, 1, 1, 2, 3, 3];
    println!("{}", remove_duplicates(&mut nums));
}

输出:

5
7


81. 搜索旋转排序数组 II Search-in-rotated-sorted-array-II

已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。

在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。

给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。

你必须尽可能减少整个操作步骤。

示例 1:

输入:nums = [2,5,6,0,0,1,2], target = 0
输出:true

示例 2:

输入:nums = [2,5,6,0,0,1,2], target = 3
输出:false

提示:

  • 1 <= nums.length <= 5000
  • -10^4 <= nums[i] <= 10^4
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • -10^4 <= target <= 10^4

进阶:

  • 这是​搜索旋转排序数组​(题号33)的延伸题目,本题中的 nums  可能包含重复元素。
  • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

代码:

fn search(nums: &Vec<i32>, target: i32) -> bool {
    let (mut left, mut right) = (0, nums.len() - 1);
    while left <= right {
        let mid = left + (right - left) / 2;
        if nums[mid] == target {
            return true;
        }
        // 无法确定左右区间是否有序,只能缩小范围
        if nums[left] == nums[mid] && nums[mid] == nums[right] {
            left += 1;
            if right > left {
                right -= 1;
            }
        } else if nums[left] <= nums[mid] { // 左区间有序
            if nums[left] <= target && target < nums[mid] {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        } else { // 右区间有序
            if nums[mid] < target && target <= nums[right] {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
    }
    false
}

fn main() {
    let nums = vec![2, 5, 6, 0, 0, 1, 2];
    println!("{}", search(&nums, 0));
    println!("{}", search(&nums, 3));
}

输出:

true
false


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更


http://lihuaxi.xjx100.cn/news/1231641.html

相关文章

北邮国院物联网Software Engineering软件工程笔记

主要依照课上ppt的面向考试学习。 pdf文件获取&#xff1a;添加文章末尾微信公众号&#xff1a;灰海宽松&#xff0c;后台回复“软件工程”获取文件。 文章目录 Introductionsoftware typesgood software featureswhat is software engineering?4 layersWhy important?Genera…

chatgpt赋能python:Python实践:如何升级pip

Python实践&#xff1a;如何升级pip Python作为一门高效的脚本语言&#xff0c;被广泛应用于数据分析、人工智能、Web开发等领域。而pip则是Python的包管理工具&#xff0c;是开发Python应用的必备工具。但是pip在使用过程中&#xff0c;有时候会出现版本不兼容或者出现漏洞等…

时间同步/集群时间同步/在线/离线

目录 一、能够连接外网 二、集群不能连接外网--同步其它服务器时间 一、能够连接外网 1.介绍ntp时间协议 NTP&#xff08;Network Time Protocol&#xff09;网络时间协议&#xff0c;是用来使计算机时间同步的一种协议&#xff0c;它可以使计算机对其服务器或时钟源做同步…

学习PS的个人笔记:掌握基本技能和高级应用

引言 Photoshop&#xff08;简称PS&#xff09;是一款广泛使用的图像处理软件&#xff0c;被设计师、摄影师和美工等职业人士广泛应用。本篇博客将带你深入学习PS的基本技能和高级应用&#xff0c;从而让你更好地应对各种图像处理任务。 基础知识 界面介绍 打开PS后&#x…

chatgpt赋能python:Python如何加断点

Python如何加断点 什么是断点 在程序执行时&#xff0c;开发人员可以设置断点&#xff0c;使得程序在断点处暂停执行&#xff0c;从而方便调试程序。当程序停在断点处时&#xff0c;可以查看变量的值、执行语句等&#xff0c;以找出程序中的错误。 Python加断点的方法 在Py…

chatgpt赋能python:Python怎么取二进制低三位?

Python怎么取二进制低三位&#xff1f; 在Python编程中&#xff0c;处理位运算是一个非常常见的任务。其中&#xff0c;取二进制低三位也是其中的一项操作。那么&#xff0c;如何实现这个操作呢&#xff1f;本篇文章将为大家介绍Python如何取二进制低三位的方法。 什么是二进…

chatgpt赋能python:如何去除Python列表中的中括号

如何去除Python列表中的中括号 在Python中&#xff0c;列表是一个非常重要的数据类型。它可以存储多个不同类型的元素&#xff0c;并且可以动态地增加或删除元素。但是&#xff0c;有时候我们需要将列表中的元素取出来&#xff0c;而不想要中括号。本文将介绍两种不同的方法来…

深究数据库E-R模型设计

深究数据库E-R模型设计 1 数据库设计概述1.1 何为数据库设计?1.2 必须要明确的几个概念2 需求分析3 概念设计3.1 现实世界向机器世界的过渡3.2 E-R 模型3.2.1 实体和属性3.2.2 实体型和键3.2.3 实体间的联系3.2.4 高级 E-R 构造3.3 概念设计方法与步骤3.4 局部 E-R 模型设计3.…