第一题 392. Is Subsequence
算法
利用两个指针不断的指示位置,向前推进
第二题 494. Target Sum
题目描述
给定一组非负整数a1, a2, …, an,以及一个目标数S。给定两种符号+和-,对于每一个整数,选择一个运算符。
计算有多少种运算符的组合方式,可以使整数的和为目标数S。
注意:
- 给定数组长度为正数并且不会超过20。
- 元素之和不会超过1000。
- 输出答案确保在32位整数范围内。
算法
回溯 O(2^n)
相当于对二叉树进行深度遍历,当我们画出所有的可能性的时候,我们发现可以利用回溯的方法对所有的可能性进行遍历.当访问到最后一个的时候,如果当前的和等于总数的话,就返回找到了,值为1。最后累加所有的可能性
DP
首先将问题进行转化,对于此题,我们可以看错寻找两个subarray p和n,使得sum(P) - sum(N)为target。经过公示的推导,我们得到了最终目的是找到一个subarray使得其和为(targe + sumall) / 2。
sum(P) - sum(N) = target
sum(P) + sum(N) + sum(P) - sum(N) = target + sum(P) + sum(N)
2 * sum(P) = target + sum(nums)
这样问题被巧妙的转化为了416. Partition Equal Subset Sum,求是否存在subarray使得其为部分和。
第三题 416. Partition Equal Subset Sum
题目描述
给定一个只包含正整数的非空数组,判断数组是否可以分成两个和相等的子数组。
算法
二维数组
利用二维数组对所有可能的状态进行表示,dp[i][j]表示对于一个总数j,前0-i个数是否存在一个subarray使得其恰好等于总数j。如果满足j - num[i-1]刚好等于0或之前已经存在的总和,则置为true。
一维数组
将二维数组简化为一维进行表示。但是注意,j的值必须从后往前推进,否则会出现问题,思路与二维数组是相似的
第四题 198. House Robber
题目描述
你是一名专业强盗,计划沿着一条街打家劫舍。每间房屋都储存有一定数量的金钱,唯一能阻止你打劫的约束条件就是:由于房屋之间有安全系统相连,如果同一个晚上有两间相邻的房屋被闯入,它们就会自动联络警察,因此不可以打劫相邻的房屋。
给定一列非负整数,代表每间房屋的金钱数,计算出在不惊动警察的前提下一晚上最多可以打劫到的金钱数。
算法
自己的
利用一个array存储到目前为止的最大值,不断向后推进。beat40%多,比后面两个方法快一点
别人的方法
利用一个二维矩阵进行存储,dp[i][0 or 1]0代表不抢,1代表强,然后不断向后推进,计算出结果。
还有一个空间复杂度为O(1)的算法
第五题 213. House Robber II
题目描述
注意:这道题是题目House Robber(入室盗贼)的扩展。
抢完上一条街的房屋之后,小偷又给自己找了一个不太引人注意的新作案场所。这一次,所有的房屋围成一个环形。也就是说第一个房屋和最后一个房屋相邻。与此同时,这些房屋的安保系统与上一条街的相同。
给定一组非负整数代表每一件房屋的金钱数,求解在不惊动警察的情况下一晚上最多可以抢到的钱数。
算法
利用之前的方法继续进行改进,我们发现,这个题目可以合并为从(0, nums.length - 2) 和 (1, nums.length - 1)两种情况。
我们分别对两种情况进行计算,然后求出最大值。
第六题 202. Happy Number
题目描述
编写一个算法判断某个数字是否是“快乐数”。
快乐数的定义过程如下:从任意一个正整数开始,将原数替换为其每一位的平方和,重复此过程直到数字=1(此时其值将不再变化),或者进入一个不包含1的无限循环。那些以1为过程终止的数字即为“快乐数”。
例如:19是一个快乐数,演算过程见题目描述。
算法
比较简单,就不多说了,两份代码,后面的是重构过的。
第七题 242. Valid Anagram
题目描述
给定字符串s和t,编写函数判断t是否为s的anagram(字谜游戏,由颠倒字母顺序而构成的字[短语])。
测试用例见题目描述。
注意:
你可以假设字符串只包含小写字母。
算法
利用hashmap
|
|
利用Array
|
|
学到的东西
String 可以通过String.toCharArray变成一个Char的数组