方法有点笨,但毕竟是自己一个字母字母敲出来的,大家有好方法,欢迎大家评论.
题目需求1:
盛最多水的容器
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转
示例
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
输入:height = [4,3,2,1,4]
输出:16
输入:height = [1,2,1]
输出:2
求最大容量 --→ 可理解为 求长方形的最大面积
解题方法1:暴力法
public int maxArea(int[] height) {
int area = 0;
//容器左边高 也可理解为第i趟
for (int i = 0; i < height.length; i++) {
//容器右边高 同理 第j次
for (int j = i + 1; j < height.length; j++) {
//求面积最大, j-i 为宽
area = Math.max(area, (j-i)* Math.min(height[i],height[j]));
}
}
return area;
}
解题方法2:双指针法冗余
为了防止有遗漏,我们需要进行俩次遍历
public int maxArea1(int[] height){
int maxarea = 0;
int left,right,area;
left=0;
while (left < height.length) {
right = height.length - 1;
while (left < right) {
if (height[left] > height[right]) {
//左边板子大 ,右边左移
right--;
} else {
break;
}
}
area = (right - left) * height[left];
maxarea = Math.max(area,maxarea);
left++;
}
right=height.length-1;
while (right > 0) {
left=0;
while (right > left){
if (height[right] > height[left]){
//右边板子大,左边右移
left++;
}else {
break;
}
}
area = (right - left)* height[right] ;
maxarea = Math.max(area, maxarea);
right--;
}
return maxarea;
}
解题方法3:双指针简化
public int maxArea2(int[] height){
int left=0,right = height.length-1;
int area=0;
while (right > left){
if (height[right] > height[left]){
area = Math.max(area,(right-left)*height[left]);
left++;
}else {
area = Math.max(area,(right-left)*height[right]);
right--;
}
}
return area;
}
题目需求2:
寻找两个正序数组的中位数(比较笨)
示例
示例1
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例2
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的中位数。
1.将俩个数组合并
2.对合并的数组排序
3.实现中数
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
//创建空数组存储新的数组
int[] nums = new int[nums1.length + nums2.length];
double mid=0;
int i=0,j;
//将数组nums1加到数组nums里边
for (i = 0; i < nums1.length; i++) {
nums[i] = nums1[i];
}
//将数组nums2加到数组nums里边
for (j=0;j<nums2.length;j++){
nums[nums1.length+j] = nums2[j];
}
//对数组nums进行排序
for (int k = 0; k < nums.length; k++) {
for (int l = 0; l < nums.length-1; l++) {
if (nums[l]>nums[l+1]){
int temp = nums[l];
nums[l] = nums[l+1];
nums[l+1] = temp;
}
}
}
//找中数
while (nums.length>0){
int a = nums.length / 2;
if (nums.length % 2 !=0){
mid = nums[a];
break;
}else {
double x = nums[a]+nums[a-1];
mid = x /2;
break;
}
}
return mid;
}