LeetCode283移动零、11盛最多的水

283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

solution1

//一次遍历数组,找到一个非零就移到前面(用 j 不断标记非零元素的位置),然后自己的位置换为0
class Solution {
    public void moveZeroes(int[] nums) {
        int j = 0;
        for (int i = 0;i < nums.length;i++) {
            if (nums[i] != 0){
                nums[j] = nums[i];
                if ( i != j){
                  mums[I] = 0;
                  }
                j++;
            }
        }
    }
}
//同上,遍历数组,如果i>j,遇到非零赋给j位,i位变为0
class Solution {
    public void moveZeroes(int[] nums) {
        int length = 0;
        if (nums == null || (length = nums.length) == 0) return;
        int j = 0;
        for(int i = 0; i < length; i++){
            if(nums[i]!=0){
                if (i > j) {
                    nums[j] = nums[i];
                    nums[i] = 0;
                }
                j++;
            }
        }
        
    }
}

solution2

//两次遍历
class Solution {
	public void moveZeroes(int[] nums) {
		if(nums==null) {
			return;
		}
		//第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
		int j = 0;
		for(int i=0;i<nums.length;++i) {
			if(nums[i]!=0) {
				nums[j++] = nums[i];
			}
		}
		//非0元素统计完了,剩下的都是0了
		//所以第二次遍历把末尾的元素都赋为0即可
		for(int i=j;i<nums.length;++i) {
			nums[i] = 0;
		}
	}
}

solution3

// 两指针,进行交换
class Solution {
    public void moveZeroes(int[] nums) {
        int j = 0;
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] != 0) {
                int temp = nums[j];
                nums[j] = nums[i];
                nums[i] = temp;
                j++;
            }
        }
        
    }
}

solution4

// 暴力方法,遇到0删掉,然后往后面加一个
没写出来

11.盛最多的水

  1. 盛最多水的容器
    给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

image

示例:

输入:[1,8,6,2,5,4,8,3,7]
输出:49

solution1 遍历枚举

class Solution {
   public int maxArea(int[] height) {
       int max = 0;
       for (int i = 0; i < height.length - 1; ++i) {
           for ( int j = i+1; j < height.length; ++j){
               int area = (j-i) * Math.min(height[j], height[i]);
               max = Math.max(area,max);
           }
       }
       return max;
   }
}

solution2

// 面积 = 宽度 * 高度,从两边向中间缩小,宽度减小了,只有高度增大了才有可能面积更大
class Solution {
    public int maxArea(int[] height) {
        int max = 0;
        for (int i = 0, j = height.length - 1; i < j;) {
            int minHeight = height[i] < height[j]? height[i ++] : height[j --]; // I++,先赋值再自增1
            int area = minHeight * (j - i + 1);
            max = Math.max(max, area);
        }
        return max;
    }
}

// 同上
class Solution {
    public int maxArea(int[] height) {
        int max = 0;
        for (int i = 0, j = height.length - 1; i < j;) {
            int minHeight = Math.min(height[j],height[i]);
            int area = minHeight * (j - i);
            if (minHeight == height[i]) i ++;
            else j --;
            max = Math.max(max, area);
        }
        return max;
    }
}
posted @ 2020-05-15 10:44  gg12138  阅读(110)  评论(0编辑  收藏  举报