html5炫酷网站,手机自媒体网站模板,企业建站划算吗,二级备案域名移动零
给定一个数组 nums#xff0c;编写一个函数将所有 0 移动到数组的末尾#xff0c;同时保持非零元素的相对顺序。
请注意 #xff0c;必须在不复制数组的情况下原地对数组进行操作。 俩种情况#xff1a; 1.当nums[i]为0的时候 直接i 2.当nums[i]不为0的时候 此时 …移动零
给定一个数组 nums编写一个函数将所有 0 移动到数组的末尾同时保持非零元素的相对顺序。
请注意 必须在不复制数组的情况下原地对数组进行操作。 俩种情况 1.当nums[i]为0的时候 直接i 2.当nums[i]不为0的时候 此时 需要跟 nums[j]交换 因为nums[j]一直处于0的位置 并且ji class Solution {public void moveZeroes(int[] nums) {int i 0 , j 0;while( i nums.length) {if(nums[i] 0) {i;} else {swap(nums,i,j);}}}public void swap(int[] nums,int i ,int j) {int tmp nums[i];nums[i] nums[j];nums[j] tmp; }
} 盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。 装多少水是由最短边决定的为什么最短边移动是因为如果长边移动那么装的水可能会少因为由最短边决定无论你长边移动后高度增加或者减少都只能是装水量变少。不可能会多。而如果移动最短边那么有可能能够装更多的水。 class Solution {public int maxArea(int[] height) {int left 0 ,right height.length-1, ret0;while(leftright) {int m Math.min(height[left],height[right])*(right-left);ret Math.max(m,ret);if(height[left] height[right]) {left;} else{right--;}}return ret;}
} 三数之和
给你一个整数数组 nums 判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k 同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。
注意答案中不可以包含重复的三元组 1.先进行排序 要找到三个数字和为0的一组数组 所有先给数组排序 如果数组首元素大于0 可以直接返回空 2.固定其中某个数字然后在剩余的数组里面找到和为 -nums[i]的数组 就说明找到了 3.细节处理 因为数组中可能有重复的数字所以我们要去“去重”至于哪些要去重呢 1i 一定要去重跳过重复元素 2 left 和right 也要去重 class Solution {public ListListInteger threeSum(int[] nums) {// 递增Arrays.sort(nums);// 定义返回的结果ListListInteger ret new ArrayList();for (int i 0; i nums.length;) {// 一个数为整数 不可能找到和为0的俩个数组 因为已经排序if (nums[i] 0) {break;}// 定义在i后面的数组区间寻找int left i 1, right nums.length - 1;// 找-nums[i]int k -nums[i];// 开始寻找和为k的一对数组while (left right) {if (nums[left] nums[right] k) {left;} else if (nums[left] nums[right] k) {right--;} else {// 说明找到了ret.add(new ArrayList(Arrays.asList(nums[i], nums[left], nums[right])));left;right--;// 去重while (left right nums[left] nums[left - 1]) {left;}while (left right nums[right] nums[right 1]) {right--;}}}i;// 去重iwhile (i nums.length nums[i] nums[i - 1] ) {i;}}return ret;}
}
无重复字符的最长子串
给定一个字符串 s 请你找出其中不含有重复字符的 最长子串的长度 题目分析 暴力解法哈希表遍历 明显这样写效率低容易超时 使用一个哈希表 ,L记录无重复字符最长子串的起始 R记录无重复字符最长子串的尾巴 用R去遍历整个数组每次遍历前判断哈希表是否存在此字符 如果hash内不存在 直接添加到hash表中并且计算此时的长度不断更新最长的 如果hash内存在 重点来了 一直判断L上的位置是否为存在的字符如果不是则一直弹出 直到没有重复的字符 然后加入到hash表中。计算此时的长度 class Solution {public int lengthOfLongestSubstring(String s) {SetCharacter hash new HashSet();int right 0,left 0 , len0;for(right 0;rights.length();right) {char ch s.charAt(right);while(left right hash.contains(ch)) {hash.remove(s.charAt(left));left;}hash.add(ch);len Math.max(len,right-left1);}return len;}
}
24-25 结语 写博客不仅仅是为了分享学习经历同时这也有利于我巩固知识点总结该知识点由于作者水平有限对文章有任何问题的还请指出接受大家的批评让我改进。同时也希望读者们不吝啬你们的点赞收藏关注你们的鼓励是我创作的最大动力