删除每行中的最大值
题目
解题思路
这里考察二维数组的使用。将二维数组每行排列后求最大值。删除每行的最大值,并将删除数字中的最大值相加。
代码实现
class Solution {
public int deleteGreatestValue(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
int ans=0;
for(int i=0;i<m;i++)
{Arrays.sort(grid[i]);
}//每一行排序
for(int i=0;i<n;i++){
int a=0;
for(int j=0;j<m;j++){
a=Math.max(a,grid[j][i]);
}//找出每一列的最大值
ans+=a;
}
return ans;
}
}
数组中最长的方波
题目
解题思路
方法一:可以先排序,在暴力枚举初始项。在查找是否存在当前值的平方时,可以采用二分法查找,因为只需要查找是否存在,所以可以用库函数Arrays.binarySearch(int[] nums, int target),返回值dx 小于0,表示不存在。
方法二:构造哈希集合去重,记录出现过的数字,枚举遍历。
代码实现
方法一:排序+二分法
class Solution {
public int longestSquareStreak(int[] nums) {
int n = nums.length;
Arrays.sort(nums);
int ans = -1;
for (int i = 0; i < n; i++) {
if (nums[i] * nums[i] > nums[n - 1]) break;
int dx = i, count = 0;
while (dx >= 0) {
idx = Arrays.binarySearch(nums, nums[dx] * nums[dx]);
if (dx >= 0) ++count;
}
ans = Math.max(ans, count + 1);
}
return ans > 1 ? ans : -1;
}
}
方法二:
class Solution {
public int longestSquareStreak(int[] nums) {
// 构造哈希集合,记录出现过的数字
HashSet<Integer> numSet = new HashSet<>();
for (int num : nums) {
numSet.add(num);
}
int max = -1;
// 枚举
for (int num : nums) {
int len = 0;
// 若包含平方数,继续枚举
while (numSet.contains(num)) {
len++;
num *= num;
}
if (len > 1 && len > max) {
max = len;
}
}
return max;
}
}