132. 分割回文串 II
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
思路
1.这个题可以在昨天求的所有分割回文串的基础上,对每个可能分割结果进行计数即可。
2.用上述方法在力扣提交超出了内存限制。
3.单纯用动态规划来做,因为之前已经得到了状态方程,所以利用状态方程来求解最小的切割次数。
完整代码
public int minCut(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
for(int i = 0; i < n; i++) {
Arrays.fill(dp[i], true);
}
for(int i = n - 1; i >= 0; i--) {
for(int j = i + 1; j < n; j++) {
dp[i][j] = (s.charAt(i) == s.charAt(j)) && dp[i + 1][j - 1];
}
}
int[] ans = new int[n];
for(int i = 0; i < n; i++) {
Arrays.fill(ans, Integer.MAX_VALUE);//注意Arrays.fill的用法
}
for(int i = 0; i < n; i++) {
if(dp[0][i]) {
ans[i] = 0;//当单个字母的时候,切割次数为0
}else {
for(int j = 0; j < i; j++) {//i是切割位置,遍历从0到i的状态
if(dp[j + 1][i]) {
ans[i] = Math.min(ans[i],ans[j] + 1);
}
}
}
}
return ans[n - 1];
}
922. 按奇偶排序数组 II
给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。
对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。
你可以返回任何满足上述条件的数组作为答案
思路
1.由已知,是为了使得奇数偶数交错分布,同时对应上坐标
2.使用双指针来解决。
3.一般来说不考虑用来输出的数组占用,因此这个题也可以用复制的方法
完整代码1
public int[] sortArrayByParityII(int[] nums) {
int[] ans = new int[nums.length];
int p = 0;
int q = 1;
for(int i = 0; i < nums.length; i++) {
if(nums[i] % 2 == 0) {
ans[p] = nums[i];
p += 2;
}else {
ans[q] = nums[i];
q += 2;
}
}
return ans;
}
完整代码2
public int[] sortArrayByParityII(int[] nums) {
int p = 1;
for(int i = 0; i < nums.length; i += 2) {
if(nums[i] % 2 == 1) {//偶数位置为奇数
while(nums[p] % 2 == 1) {//一直找到奇数位置为偶数的情况
p += 2;
}
int temp = nums[i];
nums[i] = nums[p];
nums[p] = temp;
}
}
return nums;
}
136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗
思路
1.利用异或运算的特性:0 ^ N = N, N ^ N = 0
2.因为除了某个元素以外的其余元素都出现了两次,所以遍历整个数组,将每个元素都异或,结果就是所求元素。
完整代码
public int singleNumber(int[] nums) {
int ans = 0;
for(int i = 0; i < nums.length; i++) {
ans ^= nums[i];
}
return ans;
}