Golang每日一练(leetDay0075) 打家劫舍II、最短回文串

news2025/1/11 10:17:40

目录

213. 打家劫舍 II House Robber ii  🌟🌟

214. 最短回文串 Shortest Palindrome  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


213. 打家劫舍 II House Robber ii

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 3:

输入:nums = [1,2,3]
输出:3

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

相关题目: 198. 打家劫舍 House Robber

https://hannyang.blog.csdn.net/article/details/130663466#t1

代码1: 动态规划

package main

import "fmt"

func rob(nums []int) int {
	if len(nums) == 1 {
		return nums[0]
	}
	// 不偷第一个房屋
	prevMax := 0
	currMax := 0
	for _, num := range nums[1:] {
		temp := currMax
		currMax = max(currMax, prevMax+num)
		prevMax = temp
	}
	maxVal1 := currMax
	// 不偷最后一个房屋
	prevMax = 0
	currMax = 0
	for _, num := range nums[:len(nums)-1] {
		temp := currMax
		currMax = max(currMax, prevMax+num)
		prevMax = temp
	}
	maxVal2 := currMax
	return max(maxVal1, maxVal2)
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	nums := []int{2, 3, 2}
	fmt.Println(rob(nums))
	nums = []int{1, 2, 3, 1}
	fmt.Println(rob(nums))
	nums = []int{1, 2, 3}
	fmt.Println(rob(nums))
}

代码2: 动态规划

package main

import "fmt"

func rob(nums []int) int {
    if len(nums) == 1 {
        return nums[0]
    }
    return max(robRange(nums, 0, len(nums)-2), robRange(nums, 1, len(nums)-1))
}

func robRange(nums []int, start, end int) int {
    prevMax := 0
    currMax := 0
    for i := start; i <= end; i++ {
        temp := currMax
        currMax = max(currMax, prevMax+nums[i])
        prevMax = temp
    }
    return currMax
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

func main() {
	nums := []int{2, 3, 2}
	fmt.Println(rob(nums))
	nums = []int{1, 2, 3, 1}
	fmt.Println(rob(nums))
	nums = []int{1, 2, 3}
	fmt.Println(rob(nums))
}

代码3: 动态规划

package main

import "fmt"

func rob(nums []int) int {
	if len(nums) == 1 {
		return nums[0]
	} else if len(nums) == 2 {
		return max(nums[0], nums[1])
	}
	return max(robRange(nums[1:]), robRange(nums[:len(nums)-1]))
}

func robRange(nums []int) int {
	prevMax := 0
	currMax := nums[0]
	for i := 1; i < len(nums); i++ {
		temp := currMax
		currMax = max(currMax, prevMax+nums[i])
		prevMax = temp
	}
	return currMax
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	nums := []int{2, 3, 2}
	fmt.Println(rob(nums))
	nums = []int{1, 2, 3, 1}
	fmt.Println(rob(nums))
	nums = []int{1, 2, 3}
	fmt.Println(rob(nums))
}

输出:

3
4
3

动态规划过程

  • 状态:dp[i] 表示偷窃前 i 个房屋的最大金额。

  • 转移方程:dp[i] = max(dp[i-1], dp[i-2]+nums[i-1])

    • 若偷窃第 i 个房屋,则不能偷窃第 i-1 个房屋,所以最大值为 dp[i-2]+nums[i-1]。
    • 若不偷窃第 i 个房屋,则最大值为 dp[i-1]。
  • 初始状态:dp[0] = 0 和 dp[1] = nums[0],因为只有一个房屋时最大金额为 nums[0]。

  • 最终结果:max(dp[len(nums)],dp[len(nums)-1])


214. 最短回文串 Shortest Palindrome

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

示例 1:

输入:s = "aacecaaa"
输出:"aaacecaaa"

示例 2:

输入:s = "abcd"
输出:"dcbabcd"

提示:

  • 0 <= s.length <= 5 * 10^4
  • s 仅由小写英文字母组成

代码1:

package main

import "fmt"

func shortestPalindrome(s string) string {
	n := len(s)
	for i := n; i >= 1; i-- {
		if isPalindrome(s[:i]) {
			rev := reverse(s[i:])
			return rev + s
		}
	}
	return s
}

func isPalindrome(s string) bool {
	n := len(s)
	for i := 0; i < n/2; i++ {
		if s[i] != s[n-i-1] {
			return false
		}
	}
	return true
}

func reverse(s string) string {
	n := len(s)
	b := []byte(s)
	for i := 0; i < n/2; i++ {
		b[i], b[n-i-1] = b[n-i-1], b[i]
	}
	return string(b)
}

func main() {
	s := "aacecaaa"
	fmt.Println(shortestPalindrome(s))
	s = "abcd"
	fmt.Println(shortestPalindrome(s))
}

代码2:

package main

import "fmt"

func shortestPalindrome(s string) string {
	rev := reverse(s)
	ns := s + "#" + rev
	n := len(ns)
	f := make([]int, n)
	for i, j := 1, 0; i < n; i++ {
		for j > 0 && ns[i] != ns[j] {
			j = f[j-1]
		}
		if ns[i] == ns[j] {
			j++
		}
		f[i] = j
	}
	return rev[:len(s)-f[n-1]] + s
}

func reverse(s string) string {
	n := len(s)
	b := []byte(s)
	for i := 0; i < n/2; i++ {
		b[i], b[n-i-1] = b[n-i-1], b[i]
	}
	return string(b)
}

func main() {
	s := "aacecaaa"
	fmt.Println(shortestPalindrome(s))
	s = "abcd"
	fmt.Println(shortestPalindrome(s))
}

输出:

aaacecaaa
dcbabcd


🌟 每日一练刷题专栏 🌟

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

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

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

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

 主页: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://www.coloradmin.cn/o/561541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android App外包开发技术难点

在开发android App时需要注意一些技术问题&#xff0c;包括设备兼容、性能优化、安全问题及用户体验&#xff0c;这些问题往往是android App的通用问题&#xff0c;每个android App的项目都有这些问题&#xff0c;今天和大家分享一下这方面的知识&#xff0c;希望对大家有所帮助…

研发工程师玩转Kubernetes——使用环境变量给容器中程序传递参数

在《研发工程师玩转Kubernetes——构建、推送自定义镜像》中&#xff0c;Pod的IP是通过代码获取的 def get_ip():try:s socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect((8.8.8.8, 80))ip s.getsockname()[0]finally:s.close()return ip实际我们可以在清单文件中…

python 正则表达式使用总结

re库使用 re.findall import re## 存在匹配的 txt "ai aiThe rain in Spain" x re.findall("ai", txt) print(x) # 没有匹配的 txt "adafda dafasdf" x re.findall("ai", txt) print(x)s中国人adfadsfasfasdfsdaf中国万岁\n pri…

chatgpt赋能Python-python_pythonw

Python和Pythonw——SEO助您成功 Python和Pythonw是两个最广泛使用的编程语言之一。不仅是它们提供了丰富的编程功能和轻松上手的学习曲线&#xff0c;它们还具有出色的SEO优化功能&#xff0c;因为它们是自由和开源的。 Python是什么&#xff1f; Python是一种高级编程语言…

SpringCloud微服务踩坑系列:参数不全造成的空指针

服务一直报500错误&#xff0c;看了一下后台出现了空指针异常 异常如下&#xff1a; java.lang.NullPointerException: null at com.cyf.serviceOrder.service.OrderInfoService.add(OrderInfoService.java:93) ~[classes/:na] at com.cyf.serviceOrder.controller.Or…

chatgpt赋能Python-python_qq群

Python QQ群&#xff1a;学习Python的最佳社区 Python是一个非常流行的编程语言&#xff0c;因其简单易学、可读性高等特点&#xff0c;备受开发人员的青睐。为了交流学习Python&#xff0c;越来越多的人开始组建Python QQ群。本文将介绍Python QQ群的意义、特点和如何找到合适…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-10

深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践-总结-10 虚拟机类加载机制类加载的过程初始化 类加载器类与类加载器双亲委派模型 虚拟机类加载机制 类加载的过程 初始化 类的初始化阶段是类加载过程的最后一个步骤&#xff0c;前几个类的加载动作里&#xff0c;除了…

Unity 新建你的第一个游戏,以及如何按WASD控制角色运动 (Unity Demo2D)

文章目录 初始化项目新建角色物体游戏资源管理试着导入资源试着管理资源试着使用资源 脚本是啥新建脚本编辑脚本行为逻辑按键检测获取按键移动位置★ 最终代码 (有基础请直接跳到这) 初始化项目 当你打开 Unity Hub&#xff0c;初始化一个 2D 项目&#xff0c;进入了 Unity 编…

人工智能TensorFlow MNIST手写数字识别——训练篇

上期我们分享了CNN的基本结构,本期我们就拿MNIST数据集来训练一下手写数字的数据库,以便我们下期能够使用训练好的模型,来进行手写数字的识别。 分享一下几个可视化网站,可以看到神经网络的识别过程。 http://scs.ryerson.ca/~aharley/vis/conv/ 1、插入MNIST数据集 #利…

Java安全和防护:如何保护Java应用程序和用户数据的安全

第一章&#xff1a;引言 在当今数字化时代&#xff0c;Java已经成为主流的编程语言之一。无论是企业级应用程序还是个人项目&#xff0c;Java应用程序都承载着大量的敏感数据和业务逻辑。然而&#xff0c;随着网络攻击日益猖獗&#xff0c;保护Java应用程序和用户数据的安全变…

Java-API简析_java.lang.Package类(基于JDK1.8)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/130806567 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

什么是 Spring?为什么学它?

前言 欢迎来到本篇文章&#xff01;在这里&#xff0c;我将带领大家快速学习 Spring 的基本概念&#xff0c;并解答两个关键问题&#xff1a;什么是 Spring&#xff0c;以及为什么学习 Spring。 废话少说&#xff0c;下面&#xff0c;我们开始吧&#xff01; Spring 官方文档…

MySQL索引详解(IT枫斗者)

MySQL索引详解 什么是索引 官方介绍索引是帮助MySQL高效获取数据的数据结构。简单来讲&#xff0c;数据库索引就像是书前面的目录&#xff0c;能加快数据库的查询速度。事实上&#xff0c;索引是一种数据结构&#xff0c;用于帮助我们在大量数据中快速定位到我们想要查找的数…

chatgpt赋能Python-python_pyyaml

Python与PYAML的SEO 介绍 在当今以数据为中心的时代&#xff0c;数据的存储、传输和处理出现了许多新的挑战。Python作为一门强大的编程语言&#xff0c;已经成为数据处理的利器。而PYAML则是Python中一款重要的yaml库。 YAML与PYAML YAML&#xff08;YAML Ain’t Markup L…

语法速通 uni-app随笔【uni-app】【微信小程序】【vue】

1、微信小程序 1.1、wx 小程序 工程目录 其中&#xff0c; pages目录/index目录【必有】&#xff1a; index.js 编写业务逻辑 【初始数据&#xff0c;生命周期函数】 index.json 编写配置 index.wxml 编写模板 【可理解为本页html】 index.wxss 【可理解为本页css】 1.2、wx…

The Development of DBMS in History--人工翻译

导言 数据库类型 &#xff0c;有时称为数据库模型或数据库族&#xff0c;是用于在数据库管理系统内组织数据的模式和结构。多年来已经开发了许多不同的数据库类型。一些主要是当前数据库的历史前辈&#xff0c;而另一些则经受住了时间的考验。在过去的几十年中&#xff0c;新的…

chatgpt赋能Python-python_plot散点图

Python Plot散点图&#xff1a;详细介绍与使用教程 Python是一种广泛使用的编程语言&#xff0c;特别适合处理数据科学任务。Python有大量的用于数据可视化的库&#xff0c;其中matplotlib是最重要的之一。在本文中&#xff0c;我们将探讨matplotlib中的散点图plot&#xff0c…

[ 云计算 Azure ] Chapter 07 | Azure 网络服务中的虚拟网络 VNet、网关、负载均衡器 Load Balancer

本系列已经更新文章列表&#xff08;已更新&#xff09;&#xff1a; [ Azure 云计算从业者 ] Chapter 03 | 描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx[ Azure 云计算从业者 ] Chapter 04 | Azure核心体系结构组件之数据中心、区域与区域对、可用区…

什么是智能合约存储布局?

本指南将解释智能合约中存储的数据。合约存储布局是指控制合约存储变量在长期内存中排布的规则。 读者先决条件知识 以下一般先决条件有助于理解本文&#xff1a; 熟悉面向对象的语言 位和字节 十六进制 智能合约 以太坊虚拟机&#xff08;EVM&#xff09; 哈希 无符号整数 静态…

图像噪声类别

什么是图像噪声&#xff1f; 图像噪声是图像在获取或是传输过程中受到随机信号干扰&#xff0c;妨碍人们对图像理解及分析处理 的信号。 图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量&#xff0c;图像在传输过程中产 生图像噪声的主要因素是所用的传输信道…