7月算法训练------第四天(贪心)解题报告
题目类型:贪心
题目难度:简单
第一题、2078. 两栋颜色不同且距离最远的房子
题目链接:2078. 两栋颜色不同且距离最远的房子
思路分析:
遍历整个数组,如果两个数字不相同,且两者索引之差大于max
,则更新max
的值;
代码:
class Solution {
public int maxDistance(int[] colors) {
int max = 0;
for(int i = 0; i < colors.length; i++){
for(int j = i; j < colors.length; j++){
if(colors[i] != colors[j]){
if(Math.abs(j -i) > max){
max = Math.abs(j - i);
}
}
}
}
return max;
}
}
第二题、561. 数组拆分 I
题目链接:561. 数组拆分 I
思路分析:
我们通过例子发现,本题就是将数组排序后,从0开始,每隔两位相加
即:
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] |
---|---|---|---|---|---|
6 | 2 | 6 | 5 | 1 | 2 |
排序后:
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] |
---|---|---|---|---|---|
1 | 2 | 2 | 5 | 6 | 6 |
将表中红色的数字加起来就是要求的结果。
代码:
class Solution {
public int arrayPairSum(int[] nums) {
Arrays.sort(nums);
int sum = 0;
for(int i = 0; i < nums.length; i+=2){
sum += nums[i];
}
return sum;
}
}
第三题、1323. 6 和 9 组成的最大数字
题目链接:1323. 6 和 9 组成的最大数字
思路分析:
我们将数字的每一位用数组n
存起来,然后遍历每一位(用双层for),一次改变一位(将9置6,将6置9),然后算出当前的数字temp
;
如果该数字temp
比原数字max
大,则将最大值max
更新;
最后返回最大的数字max
;
编程小细节:
在每次求完最大值后,应该将当前数字置零,否则,当前数字将越加越大,最终不是我们想要的答案。
代码:
class Solution {
public int maximum69Number (int num) {
int max = num; //记录最大数字
int temp = 0; //记录改变某一位的数字
int count = countNum(num); //记录数字num的位数
int[] n = new int[count]; //记录数字每一位的数组
for(int i = 0; i < count; i++){ //数组赋值
n[i] = num % 10;
num /= 10;
}
for(int j = 0; j < count; j++){
for(int i = 0; i < count; i++){
if(i == j){ //控制每次只改变一位
if(n[i] == 6){
temp = temp + 9 * ciFang(i);
}else{
temp = temp + 6 * ciFang(i);
}
}else{
temp = temp + n[i] * ciFang(i);
}
}
if(temp > max){
max = temp;
}
temp = 0; //小细节:每次循环完,应将当前数字置0
}
return max;
}
/**
求数字m的位数
*/
private static int countNum(int m){
int count = 0;
while(m != 0){
if(m / 10 != 0){
count++;
}
m /= 10;
}
return count + 1;
}
/**
求10的e次方
*/
private static int ciFang(int e){
if(e == 0) return 1;
int res = 1;
for(int i = 0; i < e; i++){
res = 10 * res;
}
return res;
}
}
第四题、942. 增减字符串匹配
题目链接:942. 增减字符串匹配
思路分析:
以题目中例子为例:“IDID”
我们先将String
转换为char
数组c;
c[0] | c[1] | c[2] | c[3] |
---|---|---|---|
I | D | I | D |
定义两个指针l
和r
,l
值为0
,r值为s.length()
;
然后我们预先定义s.length()+1
的int
数组seq
;
我们开始遍历char
数组c
;
当我们读到字符数组中c[i]=="I"
时,我们将当前l
的值赋给seq[i]
,然后将l++
;
当我们读到字符数组中c[i]=="D"
时,我们将当前r
的值赋给seq[i]
,然后将r--
;
因为seq
的长度比c
大1
,所以seq
的最后一个值在此时还没赋值,这时只需要将seq
的最后一个值覆为l
或r
的任意一个(因为此时l=r
);
代码:
class Solution {
public int[] diStringMatch(String s) {
int l = 0, r = s.length();
char[] c = s.toCharArray();
int[] seq = new int[r + 1];
for(int i = 0; i < seq.length - 1; i++){
if(c[i] == 'I'){
seq[i] = l;
l++;
}else{
seq[i] = r;
r--;
}
}
seq[seq.length-1] = l;
return seq;
}
}