27. 移除元素
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
假设 nums
中不等于 val
的元素数量为 k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。 - 返回
k
。
当我对数组进行删除操作时,并不是直接将数组中的元素进行删除,而是将数组的元素进行覆盖,所以我们在移除数组元素时,第一种方法
就是直接暴力枚举查找到数组中与val的值相等的数然后将该值再进行一个循环将值逐步移动到数组末尾,并且因为此下标的数据已经发生改变,我们还需要再次确认是否等于val值,我们就可以将第一遍的循环中的i减一和for循环中的i++相互抵消,从而使其可以再此判断此下标的数据是否符合删除条件,还有我们将要删除的数据移动到数组的末尾处,我们再遍历时就不需要再次遍历此数据,所以我们可以在数组大小上进行减一,从而不去判断被删除的元素,和在返回数组大小时可以直接返回此数据。
int len = nums.Length;for(int i = 0;i<len;i++){if(nums[i]==val){for(int j = i+1;j<len;j++){nums[j-1] = nums[j];}i--;len--;}}return len;
还有一种方法通过双指针的方法查找和删除。
我们定义一个快指针一个慢指针,并且将慢指针进行初始化,使其数据为0;在for循环中进行对快指针进行初始化并且每循环一次加一,我们在循环下判断:如果快指针指向的数据不等于val,就将数据赋值给慢指针所指向的地址,这是因为如果不是val代表我们不去删除它,要保留它,慢指针就是负责保留我们不被删除的数据的,并将慢指针加一,准备记录下一个没有被删除的数据。如果快指针指向的数据等于val,就不用进行任何操作,直接让快指针进行下一次循环同时快指针根据循环加一。所以我们主要就是将不被删除的数据放在数组前方,并返回一个不被删除的数据的个数。
int slow = 0;for(int fast = 0;fast<=nums.Length-1;fast++){if(nums[fast]!=val){nums[slow] = nums[fast];slow++;}}return slow;
977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
读题之后我们思考,本题是将一个非递减的数组进行平方然后组成新的数组,并返回,最简单的方法是将数组数据平方后再进行排列。
这里我们用双指针的思想来做,定义两个指针,一个左指针一个右指针,一个指向数组下标0位置,一个指向数组末尾。定义一个和nums大小相等的数组res,用while循环(left《=right)当left大于right结束循环,比较左指针的平方和右指针的平方哪个大,将其平方值赋值到res数组的末端并将末端向前移一位,并将大的指针向中间移一位。
public class Solution {public int[] SortedSquares(int[] nums) {int[] res = new int[nums.Length];int left = 0;int right = nums.Length-1;int x = right;while(left<=right){if(nums[left]*nums[left]<nums[right]*nums[right]){res[x--]=nums[right]*nums[right];right--;}else{res[x--] = nums[left]*nums[left];left++;}}return res;}
}
209. 长度最小的子数组
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的
子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3]
是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4] 输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
本题题意是给一个数组,然后给一个正整数,如果有连续的数据并且相加起来大于target就将其记录起来。寻找最少数据相加大于target的连续数据。
这里我们使用滑动窗口思想进行解题,定义两个指针一个快一个慢,快指针不断循环增加,并且将每次的数据加入进sum中,sum每次进行与target进行比较,如果大于target进入循环,并记录当前的数据长度,和最终数据长度进行比较如果大于最终数据长度的话就替换最终数据长度,以确保最终数据长度一直处于最小,并且sum不断减去慢指针对应的数据慢指针不断增大,不断更新最小最终长度,直到sum小于了target,然后再去进行快指针的循环,如此往复。
public class Solution {public int MinSubArrayLen(int target, int[] nums) {int slow = 0;int sum = 0;int x = 0;int result = int.MaxValue;for(int fast = 0;fast<=nums.Length-1;fast++){sum+=nums[fast];while(sum>=target){x = fast-slow+1;result = result>x?x:result;sum-=nums[slow];slow++;}}return result == int.MaxValue ? 0 : result;}
}
本题给一个正整数,需要生成1到n平方的所有元素,并将元素排列成为顺时针的矩阵。
本题涉及到边界的概念,使用左闭右开的原则,我们在对矩阵进行赋值时需要从上到下从左到右,先确认循环条件为(number<n*n)先遍历最上面一排,用number进行赋值后加一并且不对每一排的最后一个位置进行赋值,让其在下一行赋值中充当首位如此往复,直到number大于N*N。如果是n是奇数就将在遍历结束后判断,将最后一个值赋值给中间位置。
public class Solution {public int[][] GenerateMatrix(int n) {int[][] res = new int[n][];for(int i = 0;i<n;i++) res[i] = new int[n];int start = 0;int tail = 1;int number = 1;while(number<n*n){int j ;int i ;for(j = start;j<n-tail;j++){res[start][j] = number++;}for(i = start;i<n-tail;i++){res[i][j] = number++;}for(;j>start;j--){res[i][j] = number++;}for(;i>start;i--){res[i][j] = number++;}start++;tail++;}if (n % 2 == 1) {res[start][start] = number;}return res;}
}