算法与数据结构

数组学习

1.利用动态数组解决数据存放问题
思路:

首先判断数组内存是否已满,没满继续添加元素,已满则定义一个新的数组为原来数组的两倍,把原数组的数据拷贝到新数组中,以此类推即可。

public class Testday01T1 {
	//利用动态数组解决数据存放问题
	//存放2~N之间所有5或7的倍数
	public static void main(String[] args) {
		int[] nums=new int[5];
		int N=100;
		int count=0;
		for(int i=2;i<=N;i++){
			if(count==nums.length){
				System.out.println(Arrays.toString(nums));
				int[] nums1=new int[nums.length*2];
				System.out.println(nums1.length);
				for(int j=0;j<nums.length;j++){
					nums1[j]=nums[j];
				}
				nums=nums1;
			}else{
				if(i%5==0||i%7==0){
				nums[count++]=i;
				}
			}
			
		}
		System.out.println(Arrays.toString(nums));
	}

}
2.托普利茨矩阵问题
思路:

暴力解法,判断两个斜对角线的值是否相等,该题需要注意的是数组越界问题,要确定好遍历数组的边界问题。

public class ToplitzMatrix {
		//托普利茨矩阵(day01T2)
		//leetcode:766
	public static void main(String[] args) {
		int[][] matrix={{11,74,0,93},{40,11,74,7}};
		boolean flag=true;
		for(int i=0;i<matrix.length;i++){
			for(int j=0;j<matrix[0].length;j++){
			if(i+1<matrix.length&&j+1<matrix[0].length&&matrix[i][j]!=matrix[i+1][j+1]){
				flag=false;
				break;
				}
			}
		}
		System.out.println(flag);
	}
}
3.三数之和
思路:

自己开始没想到,后来参考了别人的解题思路,具体如下,
1.先对数组进行排序,如果第一个数大于0,直接返回。
2.第一个数小于0,则用数组前两个数和最后一个数相加,如果小于0,则用第二个数和第三个数与最后一个数相加,如果大于0,则用数组前两个数个倒数第二个数相加与0比较。注意跳出循环条件。

public class SumThree {
	//三数之和(day01T3)
	//leetcode:15
	public static void main(String[] args) {
		int[] nums={-1, 0, 1, 2, -1, -4};
		List<List<Integer>> ans = new ArrayList<>();
        if(nums == null || nums.length < 3){
        	System.out.println(ans);
        }
        Arrays.sort(nums); // 排序
        for (int i = 0; i < nums.length ; i++) {
            if(nums[i] > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环
            if(i > 0 && nums[i] == nums[i-1]) continue; // 去重
            int L = i+1;
            int R = nums.length-1;
            while(L < R){
                int sum = nums[i] + nums[L] + nums[R];
                if(sum == 0){
                    ans.add(Arrays.asList(nums[i],nums[L],nums[R]));
                    while (L<R && nums[L] == nums[L+1]) L++; // 去重
                    while (L<R && nums[R] == nums[R-1]) R--; // 去重
                    L++;
                    R--;
                }
                else if (sum < 0) L++;
                else if (sum > 0) R--;
            }
        }        
        System.out.println(ans);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值