力扣_数组
删除排序数组中的重复项
// 设置两个指针,一个是快指针fast,一个是慢指针slow
// fast的作用是扫描出第一个新的元素然后赋值给slow所指的位置
// 最后slow所指的位置就是最后一个新元素,所指向的序号+1就是数组中不重复数的个数
class Solution {
public int removeDuplicates(int[] nums) {
//n 代表 nums 数组的长度
int n = nums.length;
//设置快指针 fast 和 慢指针 slow
int fast = 1;
//slow也是1的原因是为了后面序号不用再加1
int slow = 1;
while(fast < n){
if(nums[fast] != nums[fast-1]){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
}
买卖股票的最佳时机 II
//贪心算法
//只要存在后一项元素大于前一项元素就将其加入总和中
class Solution {
public int maxProfit(int[] prices) {
//数组prices的长度
int n = prices.length;
//返回最大值
int max = 0;
for(int i = 0;i < n-1;i++){
if((prices[i+1] - prices[i]) > 0){
max = max + (prices[i+1] - prices[i]);
}
}
return max;
}
}
旋转数组
// 使用了三次的倒置
// 第一次是全部倒置一次
// 第二次是前k个元素倒置一次
// 第三次是除前k个元素外剩下元素倒置一次
class Solution {
public void rotate(int[] nums, int k) {
//nums的长度
int n = nums.length;
//有可能k大于数组的本身长度,要用除余n来调整!!!
k = k % n;
//第一次倒置
reverse(nums,0,n-1);
//第二次倒置
reverse(nums,0,k-1);
//第三次倒置
reverse(nums,k,n-1);
}
//倒置算法
public void reverse(int[] rev,int front,int end){
while(front < end){
int temp = rev[front];
rev[front] = rev[end];
rev[end] = temp;
front++;
end--;
}
}
}
存在重复元素
//先排序
//然后逐步后移,判断两者是否相同,若相同则返回true
class Solution {
public boolean containsDuplicate(int[] nums) {
//排序算法Arrays.sort()
Arrays.sort(nums);
//nums的长度
int n = nums.length;
for(int i = 0 ;i < n-1;i++){
if(nums[i] == nums[i+1]){
return true;
}
}
return false;
}
}
只出现一次的数字
// 先用temp暂存一个数
// 然后循环整个数组求出该元素出现的次数time
// 若整轮下去time == 1,则返回这个数
class Solution {
public int singleNumber(int[] nums) {
//求数组nums的长度
int n = nums.length;
for(int i = 0;i < n;i++){
int temp = nums[i];
int time = 0;
for(int j = 0;j < n;j++){
if(temp == nums[j]){
time++;
}
}
if(time == 1){
return nums[i];
}
}
return 0;
}
}
两个数组的交集 II
// 先对 nums1 数组 和 nums2 数组进行从小到大的排序
// 设一个数组num,长度和nums1、nums2中的最小长度一样
// 若nums1和nums2的元素相同,则存入nums中
// 否则,最小的那一个数组的序号往后移一位,直到num1或num2数组的序号移动最后面
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
//排序数组nums1和nums2
Arrays.sort(nums1);
Arrays.sort(nums2);
//求数组nums1和数组nums2的长度
int n1 = nums1.length;
int n2 = nums2.length;
//设一个新数组
int n = 0;
if(n1 > n2){
n = n2;
}else{
n = n1;
}
int[] nums = new int[n];
//开始往nums中存数
//i代表nums1的序号,j代表nums2的序号,k代表nums的序号
int i = 0;
int j = 0;
int k = 0;
while(i < n1 && j < n2){
if(nums1[i] == nums2[j]){
nums[k] =nums1[i];
i++;
j++;
k++;
}else if(nums1[i] < nums2[j]){
i++;
}else{
j++;
}
}
//Arrays.copyOfRange(nums,from,to)
//复制数组nums,from下标开始,to下标结束.但是不包括to.
return Arrays.copyOfRange(nums,0,k);
}
}
加一
//若不全为0,则从后往前找第一个不为9的元素,并且将其加1,其后面的元素都要置为0
// 若数组的元素都是9,那么重新设一个数组,数组长度是原始数组长度+1,头一个元素设置为1
class Solution {
public int[] plusOne(int[] digits) {
//求数组digits的长度
int n = digits.length;
//寻找第一个不为9的元素,若找到后且不是第一个元素,则将其加1并且后面的元素都置为0
for(int i = n-1;i >= 0;--i){
if(digits[i] != 9){
digits[i]++;
for(int j = i + 1;j < n;j++){
digits[j] = 0;
}
return digits;
}
}
//若数组的元素都为9,则重新设置一个数组,数组长度为原来数组长度加1
int[] rev = new int[n+1];
rev[0] = 1;
return rev;
}
}
移动零
//设置两个指针
//slow指针用来定位第一个是0的序号
//fast指针用来定位当前的序号
//当fast指针指向的元素不为0的时候,slow中的元素与fast中的元素交换
class Solution {
public void moveZeroes(int[] nums) {
//求nums的长度
int n = nums.length;
//遍历整个数组,寻找第一个为0的序号和第一个不为0的序号
int fast = 0;
int slow = 0;
while(fast < n){
if(nums[fast] != 0){
swap(nums,fast,slow);
slow++;
}
fast++;
}
}
//交换
public void swap(int[] jh,int fast,int slow){
int temp = jh[fast];
jh[fast] = jh[slow];
jh[slow] = temp;
}
}
两数之和
//暴力解法
class Solution {
public int[] twoSum(int[] nums, int target) {
//求数组nums的长度
int n = nums.length;
int i = 0;
int j = 0;
for(i = 0; i < n-1;i++){
for(j = i+1;j < n;j++){
if(target == (nums[i] + nums[j]) ){
return new int[]{i,j};
}
}
}
return new int[0];
}
}
有效的数独
//设置三个数组分别存储行,列,三三是否有重复的
//设行row为二维数组,第一个标识着第几行,第二个表示该数出现了几次
//设列column为二维数组,第一个标识着第几列,第二个表示该数出现了几次
//设Three为三维数组,前两维表示哪个三维数组,后一位表示该数在该三维数组中出现了几次
class Solution {
public boolean isValidSudoku(char[][] board) {
int[][] rows = new int[9][9];
int[][] columns = new int[9][9];
int[][][] subboxes = new int[3][3][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char c = board[i][j];
if (c != '.') {
int index = c - '0' - 1;
rows[i][index]++;
columns[j][index]++;
subboxes[i / 3][j / 3][index]++;
if (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {
return false;
}
}
}
}
return true;
}
}
旋转图像
//旋转90度,相当于先水平(中间)对换,再对角线(135度方向)对换;
class Solution {
public void rotate(int[][] matrix) {
//求的是matrix的行数,或列数;行数=列数
int n = matrix.length;
//水平对换
for(int i = 0;i < n/2;i++){
for(int j = 0;j < n;j++){
int temp = matrix[i][j];
matrix[i][j] = matrix[n-i-1][j];
matrix[n-i-1][j] = temp;
}
}
//对交换对换
for(int i = 0; i < n;i++){
for(int j = 0;j < i;j++){
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
}

浙公网安备 33010602011771号